IEEE 754和语言之间的值范围

本文关键字:范围 之间 语言 IEEE | 更新日期: 2023-09-27 18:22:17

C、Java和C#的规范规定浮点值根据IEEE 754进行格式化。

然而,数值的范围似乎有所不同:

  • 对于javafloat 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

  • 对于Cfloat-3.4×10-38至3.4×1038;double-1.7×10-308至1.7×10308

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

IEEE 754和语言之间的值范围

C、Java和C#的规范规定浮点值是根据IEEE 754进行格式化的。

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

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

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

二进制32的归一化的范围为1.1754945E-383.4028235E+38

二进制64的归一化的范围为2.2250738585072014E-3081.7976931348623157E+308

IEEE-754格式是符号/值格式,因此对于每一个支持的正值,都有一个相应的负值。IEEE-754也可以表达比上面给出的最小值更小的数量级,但的精度降低了。这些被称为"亚正规"数字。以二进制32格式表示的最小正次正规数只有一位精度,十进制值约为1.4E-45。二进制64格式支持更小的最小次正规数,十进制值约为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#爱好者,但您指定的限制值是二进制32和二进制64格式的总体(有符号)最小值和最大值。最大值与Java相同。最小值不能与Java的相比较,因为它们表达了不同的东西,但确实观察到它们与最大值具有相同的大小,符号相反

我不确定你对C的限制是从哪里来的,而且你似乎打错了最大值。你表达它们的精度肯定比实际要低。您给出的最小值对应于二进制32和二进制64格式中可表达的最小负值,与C#相同,与Java给出的最小正值同样不可比。最大值看起来与C#和Java的最大值相同,但表达精度较低,有点混乱。