如何计算双+浮点精度

时间:2011-01-06 01:32:31

标签: floating-point

我一直试图找到如何计算浮动/双精度/范围数 -3.402823e38 .. 3.402823e38和-1.79769313486232e308 .. 1.79769313486232e308。

对于int32你会做2 ^ 32 = 4294967296/2你得到-2147483648到2147483647的范围。那么我如何计算浮点数和双精度数的精度数。我想我正在寻找错误的条款,因为任何地方都没有。

4 个答案:

答案 0 :(得分:22)

嗯,这两种类型实际上如下所示:

[sign] [exponent] [mantissa]

以下列形式表示数字:

  

[sign] 1. [尾数]×2 [指数]

指数的大小和尾数的变化。对于float,指数是8位宽,而double具有11位指数。此外,指数使用 bias 进行无符号存储,float为127,double为1023。这导致float的指数范围为-126到127,double的指数范围为-1022到1023。

指数是2 某个的指数,所以在计算2 127 时,你会得到1.7×10 38 ,这会让你进入float最大值的近似范围。类似地,double具有9×10 307

显然,这些数字并不完全符合我们的预期。这是尾数发挥作用的地方。尾数表示标准化二进制数,始终以“1”开头(即标准化部分)。其余的只是点后面的数字。由于最大尾数大约为1.111111111 ... in binary 几乎 2,我们将得到大约3.4×10 38 float的最大值和1.79×10 308 作为double的最大值。

[编辑2011-01-06] 正如Mark在下面(以及问题下方)指出的那样,确切的公式如下:

Formula to calculate the exact maximum value for an IEEE-754 floating-point type: 2^(2^(e-1) )⋅(1-2^(-p) )

其中 e 是指数中的位数, p 是尾数中的位数,包括上述隐含位(由于正常化)。该公式复制了我们上面看到的,现在才准确。第一个因素,2 2 e - 1 ,是最大指数,乘以2(我们在第二个因子中保存两个) 。第二个因素是我们可以代表低于一个的最大数字。我上面说过这个数字差不多是两个。由于我们在此公式中将指数夸大了两倍,我们需要考虑到这一点,现在有一个几乎为一个的数字。我希望它不会太混乱。

在任何情况下,对于float e = 8且 p = 24),我们得到的确切值为340282346638528859811704183484516925440或大约为3.4×10 38 double,则产率(以ë = 10和 P = 53)179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368或大致1.80×10 308

<强> [/ EDIT]

另一件事:你在问题中提出了“精确度”一词,但引用了类型的范围。精度是一个完全不同的东西,指的是类型可以保留多少有效数字。同样,这里的答案在于尾数,分别为floatdouble的23位和52位。由于数字被存储归一化,我们实际上有一个隐含位,这使我们处于24和53位。现在,小数点后面的数字(或这里的二进制)点的工作方式如下:

 1.   1     0     1     1
 ↑    ↑     ↑     ↑     ↑
2^0  2^-1  2^-2  2^-3  2^-4
 =    =     =     =     =
 1   0.5   0.25  0.125 0.0625

所以double尾数中的最后一个数字表示大约2.2×10 -16 或2 -52 的值,所以如果指数是1,这是我们可以添加到数字的最小值 - 将double精度放在大约16位十进制数字旁边。同样地,float大约有七位数。

答案 1 :(得分:0)

我已经从各种(虽然不是全部)方面讨论了浮点格式。这个答案可能会对您有所帮助:https://stackoverflow.com/questions/4851671/printing-double-without-losing-precision

答案 2 :(得分:-1)

浮点类型可以表示从大约1.5×10 -45 到3.4×10 38 的值,精度为7位。

double类型可以表示从大约5.0×10 -324 到1.7×10 308 的值,精度为15-16位。

http://msdn.microsoft.com/en-us/library/aa691146%28v=vs.71%29.aspx

答案 3 :(得分:-1)

计算起来并不容易。这是因为浮动和双打的实现方式。它们分为两部分:一部分用于基数,一部分用于指数。我认为float被分为24位到基数和8位到指数。但我不确定这个! 我将根据这一事实进行进一步的计算和假设,因此这些计算可能都是错误的,但它们说明了正确的原则。这些规范也可能因语言不同而不同,即使有标准表明它们不应该。但是编程时没有什么是理所当然的:p

这意味着基数可以介于-8388608和8388607之间,指数可以介于-128和127之间。

然后当使用该号码时,计算机会这样想:

  

base * 10 ^ exponent

导致最大可能的数字是8388607 * 10 ^ 127,这将是......很多。但它会包含120个零,因为它不能指定超过7个数字。

随着数量的增加,数字的准确性会降低。这意味着您的问题格式错误;)如果您知道需要多少正确的小数,则只能为浮点数指定有效范围。如果你需要2个保证精确小数的可能性,那么float的范围是-83885到83885。