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

标签 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;
 }

请注意,即使在 powersecond() 函数中将 x 转换为整数后,答案也不会改变。即使 d 是 int 而不是 long long int,答案仍然是 679932。
我使用的编译器是 VS Code 中的 gnu gcc 编译器。

最佳答案

问题是 pow 的输出是一个浮点数 double .在您的自定义函数中,您将该输出转换为 long long ,如果 pow 返回的值将截断是略低而不是略高。见 Is floating point math broken? .当您调用 pow直接将该值保存为 double即使在乘法之后,输出舍入也会为您提供更准确的结果。

您期望 pow(100,2) 返回的值为 10000,但由于浮点的工作方式,它可能是 9999.99999999999。转换为整数时,变为 9999;乘以 68,得到 679932。

另一方面,9999.99999999999 乘以 68 变为 679999.999999999。这足够接近 680000,输出函数 <<会为你圆它。如果应用输出格式,您可以获得更准确的数字。

关于C++ pow() 函数在放入函数时会改变行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61942380/

相关文章:

c++ - 如何在 C++ 函数中输出文件?

c++ - 转发声明一个继承自不同命名空间中的类的子类

java - 简单 Java 数学问题生成器运行和终止

math - 如何让玩家在游戏中顺着地形滑行?

c - weak_alias 函数的作用是什么,它在哪里定义

visual-studio - objdump ELF 和 Windows

c++ - 从 C 调用 C++ 代码

c++ - c++ 中的直方图代码显示了一些疯狂的意外数字

c++ - 在笛卡尔坐标和屏幕坐标之间转换

makefile - 有没有什么好的工具可以检查 Makefile?