如果双位数精度≈15.955(16),为什么我可以打印50位数?

时间:2016-08-24 13:22:17

标签: c++ double

当然that's不是魔术:

double in = 1.0 / 7.0;

cout.precision(50);
cout << in << endl;

但为什么我能看到0.14285714285714284921269268124888185411691665649414(即51位数)?

双精度具有53位精度(因此应为15.955 = 16个插槽)。

cout发明数字? :P

4 个答案:

答案 0 :(得分:4)

精确度与两个相似的概念有关:

  • 实际值与目标值之间的差异(即1/7的数学结果)。
  • 相邻值之间的最小差异。

在这两种情况下,15.9x与这些十进制数字中有多少在区分值中有用/有意义有关。

没有说明准确表示这些值所需的小数位数。作为@dasblinkenlight says,在双精度浮点数的情况下,该数字可能很大。

答案 1 :(得分:2)

这是因为double s由&#34;构建块组成&#34;转换为十进制时转换为多位数。

double具有二进制表示形式,作为两个正负幂的组合。使用11位指数,double能够表示小到2 -1024 的数字。

当您将2的负幂转换为十进制表示时,小数位数等于幂的绝对值(有关2的负幂列表,请参阅this table,最多为-64)。所有这些十进制数字都是完全有效的,因此double可以表示转换为十进制时具有一千位数的数字。

答案 2 :(得分:0)

您看到的是从内部二进制表示的数字1/7(与double可以接近的数字接近)转换为a的结果十进制表示。

现在,1/7不能用基数2中的有限位序列表示,但存储在double中的任何值都可以用有限数量的数字在基数10中变换,只是超过50岁。

考虑这个片段,我将输出的精度设置为100:

cout.precision(100);
for ( int i = 2; i <= 10; ++i) {
    cout << "1 / " << i << " = " << 1.0 / i << endl;
}

您可以在结果中看到需要多少数字:

1 / 2 = 0.5
1 / 3 = 0.333333333333333314829616256247390992939472198486328125
1 / 4 = 0.25
1 / 5 = 0.200000000000000011102230246251565404236316680908203125
1 / 6 = 0.1666666666666666574148081281236954964697360992431640625
1 / 7 = 0.142857142857142849212692681248881854116916656494140625
1 / 8 = 0.125
1 / 9 = 0.111111111111111104943205418749130330979824066162109375
1 / 10 = 0.1000000000000000055511151231257827021181583404541015625

答案 3 :(得分:-5)

53位二进制数字仅等于小数点前的15.9xx十进制数字。小数点后是另一个故事。