我一直试图找到如何计算浮动/双精度/范围数 -3.402823e38 .. 3.402823e38和-1.79769313486232e308 .. 1.79769313486232e308。
对于int32你会做2 ^ 32 = 4294967296/2你得到-2147483648到2147483647的范围。那么我如何计算浮点数和双精度数的精度数。我想我正在寻找错误的条款,因为任何地方都没有。
答案 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在下面(以及问题下方)指出的那样,确切的公式如下:
其中 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] 强>
另一件事:你在问题中提出了“精确度”一词,但引用了类型的范围。精度是一个完全不同的东西,指的是类型可以保留多少有效数字。同样,这里的答案在于尾数,分别为float
和double
的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。