小编Li.*_*ang的帖子

为什么 float 不能正确表示 pow(2., 60.) ?

浮点数的计算机表示中我学到了计算机的浮点表示。
\n根据教程,对于32位浮点数,可以存储的最小正归一化数\n是2^(-126)\xef\xbc\x8c,最大归一化数是(2-2^(-23)) *2^(127)\xe2\x89\x88 2^(128)。然而,精度受到 23 位有效数的限制。

\n\n

在我看来,32位浮点数可以表示2^60而不会出现任何错误,因为:

\n\n
    \n
  1. 标志:1
  2. \n
  3. 指数:10111011(十进制187即60+127)
  4. \n
  5. 有效数:0000 ... 0000(23 个零)
  6. \n
\n\n

用指数和尾数的隐藏位(1)来表示2^60就完全足够了。

\n\n

我的测试代码如下(VS2013 + win10):

\n\n
#include <iostream>\n#include <math.h>\n#include <bitset>\n\nusing namespace std;\n\nint main()\n{\n    union\n    {\n        float input;   // assumes sizeof(float) == sizeof(int)\n        int   output;\n    }    data;\n\n    data.input = pow(2., 60.);\n\n    std::bitset<sizeof(float) * CHAR_BIT>   bits(data.output);\n\n\n    std::cout << "Total: " << bits << std::endl;\n\n\n    cout << "Sign: " << bits[31] << endl << "Exponent: ";\n\n    for (int i = 30; …
Run Code Online (Sandbox Code Playgroud)

floating-point visual-c++

1
推荐指数
1
解决办法
217
查看次数

标签 统计

floating-point ×1

visual-c++ ×1