IEEE 754和语言之间的值范围
本文关键字:范围 之间 语言 IEEE | 更新日期: 2023-09-27 18:22:17
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.79769314846232E+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定义了几种浮点格式。与您的问题相关的是单精度和双精度二进制浮点格式(二进制32和二进制64)。
二进制32的正,归一化的范围为1.1754945E-38
到3.4028235E+38
。
二进制64的正、归一化的范围为2.2250738585072014E-308
到1.7976931348623157E+308
。
IEEE-754格式是符号/值格式,因此对于每一个支持的正值,都有一个相应的负值。IEEE-754也可以表达比上面给出的最小值更小的数量级,但的精度降低了。这些被称为"亚正规"数字。以二进制32格式表示的最小正次正规数只有一位精度,十进制值约为1.4E-45
。二进制64格式支持更小的最小次正规数,十进制值约为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#爱好者,但您指定的限制值是二进制32和二进制64格式的总体(有符号)最小值和最大值。最大值与Java相同。最小值不能与Java的相比较,因为它们表达了不同的东西,但确实观察到它们与最大值具有相同的大小,符号相反
我不确定你对C的限制是从哪里来的,而且你似乎打错了最大值。你表达它们的精度肯定比实际要低。您给出的最小值对应于二进制32和二进制64格式中可表达的最小负值,与C#相同,与Java给出的最小正值同样不可比。最大值看起来与C#和Java的最大值相同,但表达精度较低,有点混乱。