双精度不能在没有精度问题的情况下表示任何 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

我以为双打的公式是sign * 2 ^ exponent * fraction;说明我的情况;通过将fraction设置为 0.5,符号设置为正,并将exponent设置为 -10241023 之间的任何值,我可以显示exponent范围内的任何2^n数字;这个推论有什么问题?公式不完整吗?

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

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

对于 F0 说明符,为什么 .NET 设计人员选择在 15 个最重要的十进制数字之后舍入值?

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

No. 您的参数在"通过将指数设置为任何值"时失败。

exponent的范围有限,你不能代表

pow(2, 1000000)

即使 1000000 是一个自然数。

http://msdn.microsoft.com/en-us/library/678hzkk9.aspx

double 关键字表示存储 64 位浮点值的简单类型。下表显示了双精度类型的精度和近似范围。

Type
double
Approximate range
±5.0 × 10−324 to ±1.7 × 10308
Precision
15-16 digits

您的问题的答案是 IEEE 754 双精度数字是 64 位值:

  • 1 位是符号
  • 11 位表示指数
  • 52 位
  • 代表有效数(但由于有点深的魔力,符号实际上具有 53 位精度)。

它可以表示不超过 264离散值 — 与 64 位整数相同(实际上由于 NaN、正零和负零等原因而更少)

然而,它的范围比 64 位整数的范围大得多:它可以表示大约从 10-308 到 10+308 的十进制值......尽管精度不超过 15 到 17 位十进制数字。

浮点以精度换取范围。这是一种权衡。

有关更多详细信息,请参阅 IEEE-754 双精度二进制浮点格式。

更好的是,阅读David Goldberg在1991年的论文"每个计算机科学家都应该知道的关于浮点运算的知识":

抽象。浮点算术被许多人认为是深奥的学科。 这是相当令人惊讶的,因为浮点在计算机系统中无处不在: 几乎每种语言都有一个浮点数据类型;从PC到超级计算机的计算机 有浮点加速器;大多数编译器将被调用来编译浮点 不时算法;几乎每个操作系统都必须响应浮点 溢出等异常情况。本文介绍了一个关于浮点运算方面的教程 对计算机系统的设计者有直接影响。它从浮点背景开始 表示和舍入误差,继续讨论IEEE浮点标准, 最后举例说明计算机系统构建者如何更好地支持浮点数。

大卫·戈德堡。1991. "每个计算机科学家都应该知道的关于浮点运算的知识"。 ACM Comput。苏尔夫。23,1(1991年3月),5-48。DOI=10.1145/103162.103163 http://doi.acm.org/10.1145/103162.103163

最新更新