当然that's不是魔术:
double in = 1.0 / 7.0;
cout.precision(50);
cout << in << endl;
但为什么我能看到0.14285714285714284921269268124888185411691665649414
(即51位数)?
双精度具有53位精度(因此应为15.955 = 16个插槽)。
cout
发明数字? :P
答案 0 :(得分:4)
精确度与两个相似的概念有关:
在这两种情况下,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十进制数字。小数点后是另一个故事。