为什么std :: setprecision显示不存在的精度位以及如何查看实际浮点数

时间:2018-01-16 14:03:29

标签: c++ precision

我想看看float和double内容,但是我得到了很多额外的意外精确数字。

printf("%.55f\n", 1.123456789012345);
cout << setprecision(100) << 1.123456789012345 << endl;
  

1.1234567890123450251138592648203484714031219482421875000   1.1234567890123450251138592648203484714031219482421875

虽然我期待这样的事情:

  

... 1.12345678901234500
  1.123456789012345

在Octave我也得到意想不到的输出:

>> format long
>> single(1.123456789012345)
ans =  1.12345683574677

1 个答案:

答案 0 :(得分:3)

  

我想看看浮动和双重内容

您实际上是在观察最接近1的十进制数,该数字可以由浮点表示法表示完全。 请注意,其他一些十进制数字(如std::cout << std::setprecision(100) << 1.123456789012345 << std::endl; std::cout << std::setprecision(100) << 1.0 << std::endl; std::cout << std::setprecision(100) << 1.1 << std::endl; std::cout << std::setprecision(100) << 1.5 << std::endl; )可以用浮点表示法精确表示。

因此,运行:

1.1234567890123450251138592648203484714031219482421875
1
1.100000000000000088817841970012523233890533447265625
1.5

将打印:

containerView.center.x -= 200

我强烈建议阅读David Goldberg的优秀What Every Computer Scientist Should Know About Floating-Point Arithmetic