我一直试图找到如何计算浮动/双精度/范围数-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 38为float
的最大值和1.79×10 308为最大值double
.
[编辑2011-01-06]正如马克在下面(以及问题下方)指出的,确切的公式如下:
其中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位尾数float
和double
,分别.由于数字被存储归一化,我们实际上有一个隐含位,这使我们处于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
大约有七位数.