如何计算双+浮点精度

Mik*_*iaz 10 floating-point

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

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

Joe*_*oey 23

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

[sign] [exponent] [mantissa]
Run Code Online (Sandbox Code Playgroud)

用以下形式表示数字:

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

随着指数的大小和尾数的变化.因为float指数是8位宽,而double具有11位指数.此外,指数存储无符号,偏差为127 for float和1023 for double.这导致指数的范围为-126到127,float而-1022为1023 double.

指数是2个东西的指数,因此当计算2 127时,你将获得1.7×10 38,这将使你处于float最大值的近似范围内.同样适用double于9×10 307.

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

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

计算IEEE-754浮点类型的精确最大值的公式: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.

[/编辑]

另一件事:你在问题中提出了"精确度"一词,但你引用了类型的范围.精度是一个完全不同的东西,指的是类型可以保留多少有效数字.同样,答案在这里就在于它是23个52位尾数floatdouble,分别.由于数字被存储归一化,我们实际上有一个隐含位,这使我们处于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
Run Code Online (Sandbox Code Playgroud)

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