C、Java 和 C# 的规范表示浮点值 根据 IEEE 754 进行格式化。
但是值的范围似乎不同:
对于java,
float
1.4E-45 到 3.4028235E38 ;双
4.9E-324 至 1.7976931348623157E308对于C#,
浮点
-3.402823E+38 到 3.402823E+38 ;双
-1.79769313486232E+308 到 1.79769313486232E+308对于C,
浮点
-3.4×10-38 到 3.4×1038 ;双
-1.7×10-308 至 1.7×10308
那么真正的 IEEE 754 值范围是多少?
最佳答案
The specification of C, Java and C# says that floating point values are formatted according to IEEE 754.
Jave 和 C#,是的。 C,不。事实上,C 明确允许各种数字格式,尽管大多数实现实际上确实使用 IEEE-754 表示形式,但 C 并不需要它。
So what are the real IEEE 754 range of values?
IEEE-754 定义了多种浮点格式。与您的问题相关的是单精度和 double 二进制浮点格式(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 的最大值相同,但表示精度较低并且有点困惑。
关于java - IEEE 754 和语言之间的值范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33759333/