C++ pow() 函数在放入函数时会改变行为

Sud*_*thi 7 c++ math gnu

我已经用 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,输出函数<<将为您舍入它。如果应用输出格式,您可以获得更精确的数字。

  • @DanielLangr,你不知道如何通过“double”计算“pow”的机制。即使可以表示精确的结果,它仍然很容易偏离一个 LSB。 (2认同)