在 C++ 中使用 pow 时精度损失
Loss of precision when using pow in C++
10^1.64605 = 44.2639330165
但是在 C++ 中使用 pow
:
double p = pow(10,1.64605) returns 44.2641.
这里有办法提高精度吗?我尝试将双方都投射到 long double
但这也没有帮助。
比较有意思的是:
cout<<p;
double a = -1.64605;
cout<<pow(10,-a);
p = pow(10, (-p));
cout<<p;
输出是:
-1.64605
44.2639
44.2641
为什么?
答案将通过检查 p
找到。您没有显示它是如何初始化的。
您会发现 p != a
,即使当您将它们打印到控制台时它们看起来是一样的。当您打印到控制台时,您只打印了前 6 位有效的十进制数字。以更高的精度打印这两个值,您会发现它们不相等。
你说的是:
double p = pow(10,1.64605);
的计算结果为 44.2641
。但事实并非如此。如果您实际执行该代码,您将看到它。
double p = pow(10,1.64605);
cout << p;
输出44.2639
.
您的代码与上面的代码略有不同。它是:
cout << p;
p = pow(10, (-p));
cout << p;
将p
的原始值输出到全精度,全部显示出来。
cout
正在截断您的双倍显示,但 pow
计算的值可能至少与您预期的一样精确。有关如何在控制台中显示更精确的信息,请参阅:
How do I print a double value with full precision using cout?
鉴于 David 的鼓励,我将详细说明。
您说 double p = pow(10,1.64605) returns 44.2641
但这是不正确的。它 returns 44.26393301653639156;没有任何格式说明符,它显示为 44.2639(稍后会看到)。
当您在第二个代码片段中 cout
p
的原始值时,它显示 -1.64605
(由于精度降低 格式化 )并且您假设它 是 正好是 -1.64605 而它实际上介于 -1.64605115... 和 -1.64605213... 之间, 是 在表达式 cout << pow(10, (-p));
中求值为 44.2641
10^1.64605 = 44.2639330165
但是在 C++ 中使用 pow
:
double p = pow(10,1.64605) returns 44.2641.
这里有办法提高精度吗?我尝试将双方都投射到 long double
但这也没有帮助。
比较有意思的是:
cout<<p;
double a = -1.64605;
cout<<pow(10,-a);
p = pow(10, (-p));
cout<<p;
输出是:
-1.64605
44.2639
44.2641
为什么?
答案将通过检查 p
找到。您没有显示它是如何初始化的。
您会发现 p != a
,即使当您将它们打印到控制台时它们看起来是一样的。当您打印到控制台时,您只打印了前 6 位有效的十进制数字。以更高的精度打印这两个值,您会发现它们不相等。
你说的是:
double p = pow(10,1.64605);
的计算结果为 44.2641
。但事实并非如此。如果您实际执行该代码,您将看到它。
double p = pow(10,1.64605);
cout << p;
输出44.2639
.
您的代码与上面的代码略有不同。它是:
cout << p;
p = pow(10, (-p));
cout << p;
将p
的原始值输出到全精度,全部显示出来。
cout
正在截断您的双倍显示,但 pow
计算的值可能至少与您预期的一样精确。有关如何在控制台中显示更精确的信息,请参阅:
How do I print a double value with full precision using cout?
鉴于 David 的鼓励,我将详细说明。
您说 double p = pow(10,1.64605) returns 44.2641
但这是不正确的。它 returns 44.26393301653639156;没有任何格式说明符,它显示为 44.2639(稍后会看到)。
当您在第二个代码片段中 cout
p
的原始值时,它显示 -1.64605
(由于精度降低 格式化 )并且您假设它 是 正好是 -1.64605 而它实际上介于 -1.64605115... 和 -1.64605213... 之间, 是 在表达式 cout << pow(10, (-p));