其他分享
首页 > 其他分享> > 没有精度问题,双精度不能代表任何2 ^ n数字吗? n是自然的

没有精度问题,双精度不能代表任何2 ^ n数字吗? n是自然的

作者:互联网

这段代码:

double x = 2.0;
for(int i = 1 ; i<1024 ; i+=i) {
    Console.WriteLine( String.Format( "2^{0} = {1:F0}", i, x ) );
    x*=x;
}

输出:

2^1 = 2
2^2 = 4
2^4 = 16
2^8 = 256
2^16 = 65536
2^32 = 4294967296
2^64 = 18446744073709600000
2^128 = 340282366920938000000000000000000000000
2^256 = 115792089237316000000000000000000000000000000000000000000000000000000000000000
2^512 = 13407807929942600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

我以为double的公式是符号* 2 ^指数*分数;为了说明我的情况;将小数设置为0.5,将符号设置为正,并通过将指数设置为-1024到1023之间的任何值,我可以显示在指数范围内的任何2 ^ n数字;这种扣除有什么问题?公式不完整吗?

解决方法:

如下面的代码所示(使用Jon Skeet的DoubleConverter类),一个double可以精确地表示2的幂:

Console.WriteLine(String.Format("2^{0} = {1}", i, DoubleConverter.ToExactString(x)));

对于F0声明符,.NET设计人员为什么选择将值四舍五入到15个最高有效小数点后?

我的猜测:显示精确值(例如18446744073709551616)可能意味着双精度对所有这些数字都是精确的,而实际上双精度无法区分该值和18446744073709600000.而且,显示舍入后的值与指数表示法一致:1.84467440737096 E 19.

标签:double,double-precision,c
来源: https://codeday.me/bug/20191121/2048645.html