C,Java和C#的规范说明了浮点值 根据IEEE 754格式化。
但值的范围似乎不同:
java ,float
1.4E-45至3.4028235E38; double
4.9E-324 to
1.7976931348623157E308
C#,float
-3.402823E + 38至3.402823E + 38; double
-1.79769313486232E + 308至1.79769313486232E + 308
C ,float
-3.4×10-38至3.4×1038; double
-1.7×10-308至1.7×10308
那么真正的IEEE 754值范围是什么?
答案 0 :(得分:1)
C,Java和C#的规范说浮点值是根据IEEE 754格式化的。
Jave和C#,是的。 C,没有。 C实际上明确允许各种数字格式,虽然大多数实现实际上都使用IEEE-754表示,但C不需要它。
那么真正的IEEE 754值范围是什么?
IEEE-754定义了几种浮点格式。与您的问题相关的是单精度和双精度二进制浮点格式(binary32和binary64)。
正,规范化的范围,binary32的值为1.1754945E-38
到3.4028235E+38
。
正,规范化的范围,binary64的值为2.2250738585072014E-308
到1.7976931348623157E+308
。
IEEE-754格式是符号/值格式,因此对于每个支持的正值,都有相应的负值。 IEEE-754也可以表示比上面给出的最小值更小的数量,但具有降低的精度。这些被称为“次正规”数字。二进制32格式中可表示的最小正次正规数只有一位精度,十进制值约为1.4E-45
。 binary64格式支持更小的最小次正规数,十进制值约为4.9E-324
。
您认为您看到的差异是由于您比较不同的数量,和/或以不同的精度或不同的表示形式表达的。
您报告的Java数量可能来自Float.MIN_VALUE
,Float.MAX_VALUE
,Double.MIN_VALUE
和Double.MAX_VALUE
。这些分别是IEEE-754二进制32和二进制64格式中可表达的最小正次正规和最大值。 Java还提供Float.MIN_NORMAL
和Double.MIN_NORMAL
,它们以各自的格式提供最小的正规范化值。这些都完全映射到IEEE-754格式的各种限制值。
我不是C#家伙,但您指定的限制值是binary32和binary64格式的总体(签名)最小值和最大值。最大值与Java相同。最小值与Java不可比,因为它们表达了不同的东西,但确实观察到它们具有与最大值相同的幅度,具有相反的符号。
我不确定你对C的限制来自哪里,并且你似乎错误输入了最大值。你肯定表示它们的精确度低于实际精度。您给出的最小值对应于binary32和binary64格式中可表示的最小负值,与C#相同,并且与Java给出的最小正值同样无法比较。最大值看起来与C#和Java的最大值相同,但表示精度较低且有点损坏。