java - IEEE 754 和语言之间的值范围

标签 java c# c ieee-754

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

但是值的范围似乎不同:

  • 对于javafloat 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-383.4028235E+38 >.

binary64 的归一化值的范围为 2.2250738585072014E-3081.7976931348623157E+308.

IEEE-754 格式是符号/值格式,因此对于每个支持的正值,都有一个相应的负值。 IEEE-754 还可以表达比上面给出的最小值更小的数字,但精度会降低。这些被称为“次正规”数。以二进制 32 格式表示的最小正次正规数只有一位精度,十进制值约为 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/

相关文章:

c - 在 Windows 静态库中查找 undefined symbol

java - 如何在 GWT 中动态访问 Java 对象的属性?

java - 有时在 exoplayer 中的视频缓冲速度很慢?

java - 使用 ImageIO 将文件后缀映射到内容类型

c# - 使用枚举查找文件夹中的所有文件

c# - 如何在 UWP 应用程序中仅启用横向模式?

c - 分析输出字符如元音、标点符号等

Java:使函数不是虚拟的-在父引用上调用父方法

c# - 将字符串从 C# 传递到 C++ .dll 会扰乱数据

c - 将 char 转换为整数并返回值的函数 [C]