我已经用 C++ 编程一段时间了。我之前已经看到,由于精度问题,幂函数对更大的幂给出了错误的答案,但是今天在解决编码问题时,我看到在相同类型的参数下,pow() 函数在放入函数时与直接计算时给出了不同的值。
#include <iostream>
#include <math.h>
using namespace std;
long long n,d;
long long power(long long x)
{
return pow(100,x);
}
long long powersecond(long long x)
{
return pow(100,(int)x);
}
int main()
{
n = 68; d = 2;
cout << n*power(d) <<endl; // outputs 679932
cout << n*pow(100,d) <<endl; // outputs 680000
cout << n*powersecond(d) <<endl; // outputs 679932
cout << n*pow(100,(int)d) <<endl; // outputs 680000
return 0;
}
Run Code Online (Sandbox Code Playgroud)
请注意,即使在 powersecond() 函数中将 x 转换为整数后,答案也不会改变。即使 d 是 int 而不是 long long int,答案仍然是 679932。我使用的编译器是 VS Code 中的 gnu gcc 编译器。
Mar*_*som 11
问题是 的输出pow是一个浮点数double。在您的自定义函数中,您将该输出转换为long long,如果返回的值pow略低而不是略高,则会截断。请参阅浮点数学是否已损坏?. 当您pow直接调用时,该值double在乘法后保持为偶数,并且输出舍入为您提供更准确的结果。
您希望 返回的值pow(100,2)是 10000,但由于浮点的工作方式,它可能是 9999.99999999999。当转换为整数时,即变为 9999;乘以 68,得到 679932。
另一方面,9999.99999999999 乘以 68 变成 679999.999999999。这足够接近 680000,输出函数<<将为您舍入它。如果应用输出格式,您可以获得更精确的数字。