不投掷的理由是什么
这些情况下的例外情况?这是一个
IEEE 标准,还是仅仅是一个
Java 设计者的选择?
第 20 页和第 21 页第 2.2.1 NAN 和 2.2.2 Infinity 部分下的IEEE 754-1985 标准清楚地解释了标准要求 NAN 和 Infinity 值的原因。因此,这不是 Java 的事情。
3.8.1 Floating Point Arithmetic and IEEE 754 部分中的Java Virtual Machine Specification 指出,当执行到整数类型的转换时,JVM 将向零进行舍入,这解释了您所看到的结果。
该标准确实提到了一个名为“陷阱处理程序”的功能,该功能可用于确定何时发生溢出或 NAN,但 Java 虚拟机规范明确指出这不适用于 Java。它在第 3.8.1 节中说:
浮点运算
Java虚拟机不抛出
异常、陷阱或其他信号
IEEE 754 的特殊条件
无效操作,除以零,
上溢、下溢或不精确。这
Java虚拟机没有信号
NaN 值。
因此,无论后果如何,行为都不是未指定的。
我有什么不好的后果
不知道是否会出现异常
这样的演员可能吗?
了解标准中所述的原因应该足以回答这个问题。该标准通过详尽的示例解释了您在此处要求的后果。我会发布它们,但是这里的信息太多了,并且这些示例可能无法在此编辑工具中正确格式化。
编辑
我正在阅读 JCP 最近发布的关于 Java Virtual Machine Specification 的最新维护评论,这是他们在 JSR 924 上工作的一部分,在 2.11.14 节命名类型转换指令中包含更多信息,可以帮助您您对答案的追求,还不是您正在寻找的东西,但我相信它会有所帮助。它说:
在 a 的缩小数字转换中
浮点值转换为整数
类型 T,其中 T 是 int 或 long,
浮点值被转换
如下:
- 如果浮点值是 NaN,则转换的结果是一个
int 或 long 0。
- 否则,如果浮点值不是无穷大,
浮点值四舍五入为
使用 IEEE 754 的整数值 V
向零模式舍入。
有两种情况:
- 如果 T 是 long 并且该整数值可以表示为 long,则
结果是长值 V。
- 如果 T 是 int 类型并且这个整数值可以表示为
一个 int,那么结果就是 int
价值 V。
否则:
- 要么值太小(大的负值
幅度或负无穷大),
结果是最小的
int 类型的可表示值或
长。
- 或者该值必须太大(一个大的正值或
正无穷大),结果
是最大的可表示值
输入 int 或 long。
从
double to float 的行为符合
使用 IEEE 754。结果是正确的
使用 IEEE 754 四舍五入
最近模式。值太小而不能
表示为浮点数被转换为
类型为正或负零
漂浮;一个太大的值
表示为浮点数被转换为
正无穷或负无穷。一种
双 NaN 始终转换为
一个浮点数 NaN。
尽管溢出,
下溢或精度损失
可能会发生,从而缩小
数字类型永远不会导致
Java 虚拟机抛出一个
运行时异常(不要混淆
具有 IEEE 754 浮点
例外)。
我知道这只是重申了您已经知道的内容,但它有一个线索,似乎 IEEE 标准要求四舍五入到最接近的值。也许您可以在那里找到这种行为的原因。
编辑
第 2.3.2 节舍入模式状态中讨论的 IEEE 标准:
通过
默认情况下,舍入表示朝
这
最近。该标准要求其他三个
提供舍入模式;即,朝
0,向 +Infinity 舍入和向 -Infinity 舍入。
当与转换为整数运算一起使用时,向 -Infinity 舍入会导致转换成为 floor 函数,而向 +Infinity 舍入
是天花板。
模式舍入会影响溢出,因为当向 O 或向 O 舍入时
- 无限是有效的,正数的溢出会导致默认结果是最大的可表示数字,而不是 + 无限。
同样,溢出
负量会产生
向 + 无穷大或向 O 舍入时最大的负数有效。
然后他们继续提到为什么这在区间算术中很有用的例子。再次不确定这是否是您正在寻找的答案,但它可以丰富您的搜索。