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

但是,值的范围似乎有所不同:


对于Java,float 1.4E-45至3.4028235E38; double 4.9E-324至
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值范围是多少?

最佳答案

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还可以表示比上面给出的最小值小的数量级,但精度降低。这些被称为“次普通”数。以binary32格式表示的最小的次正规数只能具有一位精度,而十进制值大约为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相同,但是表示为较低的精度并有些混乱。

关于java - IEEE 754和语言之间的值范围,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33759333/

10-11 17:51