此代码:
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的公式是sign * 2 ^ exponent * fraction
;说明我的情况;将fraction
设置为0.5
,将符号设置为正数,并将exponent
设置为-1024
到1023
之间的任何值,我可以显示任何{{ 1}} 2^n
范围内的数字;这个扣除有什么问题?公式是否不完整?
答案 0 :(得分:3)
double
可以完全代表2的幂,如下面的代码所示(使用Jon Skeet&#39; DoubleConverter
类):
Console.WriteLine(String.Format("2^{0} = {1}", i, DoubleConverter.ToExactString(x)));
对于F0说明符,为什么.NET设计者选择在15个最重要的十进制数字之后舍入值?
我的猜测:显示确切的值(例如18446744073709551616)可能意味着double
精确到所有这些数字,而实际上double
无法区分该值和18446744073709600000.此外,显示舍入值与指数表示法一致:1.84467440737096E + 19.
答案 1 :(得分:0)
没有。你的论证失败了“通过将指数设置为任何值”。
exponent
上的范围有限,您无法代表
pow(2, 1000000)
即使1000000是自然数。
答案 2 :(得分:0)
http://msdn.microsoft.com/en-us/library/678hzkk9.aspx
double关键字表示存储64位浮点值的简单类型。下表显示了double类型的精度和近似范围。
Type
double
Approximate range
±5.0 × 10−324 to ±1.7 × 10308
Precision
15-16 digits
答案 3 :(得分:0)
您的问题的答案是IEEE 754双精度数是64位值:
它可以表示不超过2个 64 离散值 - 与64位整数相同(实际上由于NaN
之类的东西更少,正负零等。)
但范围远大于64位整数:它可以表示大致从10 -308 到10 +的十进制值308 ...虽然精度不超过15到17位十进制数。
范围的浮点交易精度。这是一个权衡。
有关详细信息,请参阅IEEE-754 Double Precision Binary Floating Point Format。
更好的是,阅读David Goldberg 1991年的论文"What every computer scientist should know about floating-point arithmetic":
摘要。浮点运算被很多人认为是一个深奥的主题。 这是相当令人惊讶的,因为浮点在计算机系统中无处不在: 几乎每种语言都有浮点数据类型;从PC到超级计算机的计算机 有浮点加速器;大多数编译器都会被调用来编译浮点数 算法不时;几乎每个操作系统都必须响应浮点数 溢出等异常。本文提供了一个关于浮点方面的教程 对计算机系统的设计者有直接影响。它以浮点背景开始 表示和舍入误差,继续讨论IEEE浮点标准, 最后举例说明计算机系统构建者如何更好地支持浮点。
大卫戈德伯格。 1991年。“每个计算机科学家都应该了解浮点运算”。 ACM Comput。监测网。 23,1(1991年3月),5-48。 DOI = 10.1145 / 103162.103163 http://doi.acm.org/10.1145/103162.103163