IEEE 754和语言之间的值范围

时间:2015-11-17 14:24:06

标签: java c# c ieee-754

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值范围是什么?

1 个答案:

答案 0 :(得分:1)

  

C,Java和C#的规范说浮点值是根据IEEE 754格式化的。

Jave和C#,是的。 C,没有。 C实际上明确允许各种数字格式,虽然大多数实现实际上都使用IEEE-754表示,但C不需要它。

  

那么真正的IEEE 754值范围是什么?

IEEE-754定义了几种浮点格式。与您的问题相关的是单精度和双精度二进制浮点格式(binary32和binary64)。

规范化的范围,binary32的值为1.1754945E-383.4028235E+38

规范化的范围,binary64的值为2.2250738585072014E-3081.7976931348623157E+308

IEEE-754格式是符号/值格式,因此对于每个支持的正值,都有相应的负值。 IEEE-754也可以表示比上面给出的最小值更小的数量,但具有降低的精度。这些被称为“次正规”数字。二进制32格式中可表示的最小正次正规数只有一位精度,十进制值约为1.4E-45。 binary64格式支持更小的最小次正规数,十进制值约为4.9E-324

您认为您看到的差异是由于您比较不同的数量,和/或以不同的精度或不同的表示形式表达的。

您报告的Java数量可能来自Float.MIN_VALUEFloat.MAX_VALUEDouble.MIN_VALUEDouble.MAX_VALUE。这些分别是IEEE-754二进制32和二进制64格式中可表达的最小正次正规和最大值。 Java还提供Float.MIN_NORMALDouble.MIN_NORMAL,它们以各自的格式提供最小的正规范化值。这些都完全映射到IEEE-754格式的各种限制值。

我不是C#家伙,但您指定的限制值是binary32和binary64格式的总体(签名)最小值和最大值。最大值与Java相同。最小值与Java不可比,因为它们表达了不同的东西,但确实观察到它们具有与最大值相同的幅度,具有相反的符号。

我不确定你对C的限制来自哪里,并且你似乎错误输入了最大值。你肯定表示它们的精确度低于实际精度。您给出的最小值对应于binary32和binary64格式中可表示的最小负值,与C#相同,并且与Java给出的最小正值同样无法比较。最大值看起来与C#和Java的最大值相同,但表示精度较低且有点损坏。