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-38
至3.4028235E+38
。
binary64的正归一化正值范围是2.2250738585072014E-308
至1.7976931348623157E+308
。
IEEE-754格式是符号/值格式,因此对于每个受支持的正值,都有一个对应的负值。 IEEE-754还可以表示比上面给出的最小值小的数量级,但精度降低。这些被称为“次普通”数。以binary32格式表示的最小的次正规数只能具有一位精度,而十进制值大约为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相同,但是表示为较低的精度并有些混乱。
关于java - IEEE 754和语言之间的值范围,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33759333/