在没有精度问题的情况下,是否能够代表任何2 ^ n数字? n很自然

时间:2014-11-19 18:01:38

标签: c# double double-precision

此代码:

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设置为-10241023之间的任何值,我可以显示任何{{ 1}} 2^n范围内的数字;这个扣除有什么问题?公式是否不完整?

4 个答案:

答案 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位值:

  • 1位是标志
  • 11位代表指数
  • 52位代表有效数字(但由于有点深刻的magick,signficand实际上有53位精度)。

它可以表示不超过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