java - 为什么将 Double.NaN 转换为 int 不会在 Java 中抛出异常?

标签 java casting floating-point ieee-754

所以我知道 IEEE 754 为非实数的值指定了一些特殊的浮点值。在 Java 中,将这些值转换为原始 int 确实不会像我预期的那样抛出异常。相反,我们有以下内容:

int n;
n = (int)Double.NaN; // n == 0
n = (int)Double.POSITIVE_INFINITY; // n == Integer.MAX_VALUE
n = (int)Double.NEGATIVE_INFINITY; // n == Integer.MIN_VALUE

在这些情况下抛出异常的理由是什么?这是 IEEE 标准,还是仅仅是 Java 设计者的选择?如果此类强制转换可能出现异常,是否会产生我不知道的不良后果?

最佳答案

What is the rationale for not throwing exceptions in these cases?

我想原因包括:

  • 这些是边缘情况,在执行此类操作的应用程序中可能很少发生。

  • 该行为并非“完全出乎意料”。

  • 当应用程序从 double 转换为 int 时,预计会丢失大量信息。应用程序要么忽略这种可能性,要么在强制转换之前进行检查以防止发生这种情况……这也可以检查这些情况。

  • 没有其他 double /浮点运算会导致异常,并且(IMO)在这种情况下这样做会有点精神 split 。

  • 在某些硬件平台(当前或 future )上...可能会影响性能。

一位评论员是这样说的:

"I suspect the decision to not have the conversion throw an exception was motivated by a strong desire to avoid throwing exceptions for any reasons, for fear of forcing code to add it to a throws clause."

我认为这不是一个合理的解释:

  • Java 语言设计者1 没有“出于任何原因”避免抛出异常的心态。 Java API 中有许多示例可以证明这一点。

  • throws 子句的问题已通过取消检查异常得到解决。事实上,许多相关的异常,如 ArithmeticExceptionClassCastException 都因此被声明为未检查。

Is this an IEEE standard, or was it merely a choice by the designers of Java?

我认为是后者。

Are there bad consequences that I am unaware of if exceptions would be possible with such casts?

除了明显的之外没有...

(但这并不真正相关。JLS 和 JVM 规范说的就是他们说的,更改它们可能会破坏现有代码。而且我们现在谈论的不仅仅是 Java 代码......)


我已经做了一些挖掘。许多可用于从 double 转换为整数的 x86 指令似乎会生成硬件中断……除非被屏蔽。 (对我而言)不清楚指定的 Java 行为比 OP 建议的替代方法更容易还是更难实现。


1 - 我不否认某些 Java 程序员确实有这种想法。但他们曾经/不是 Java 设计者,这个问题专门询问 Java 设计原理。

关于java - 为什么将 Double.NaN 转换为 int 不会在 Java 中抛出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5876369/

相关文章:

arrays - 为什么在使用 ReadBytesExt 从 byte slice 段中读取整数时会出现错误 "trait bounds were not satisfied"?

mysql - SQL 查询中的 CONVERT 或 CAST 字段

java swing获取div html的属性样式

java - XMLHttpRequest.open() 之后不会出现 URL 中的 AJAX 变量

java - Log4j 具有不同记录器和一个属性文件的多个类

java - 由于 ResourceCycle 错误,无法在 Android Studio 中生成 apk 文件

C++ : Seeding mt的低32位包含什么

c++ - _controlfp 不改变精度

c - MPIR 的浮点类型不准确吗?

math - 您如何正确计算具有 32 位 float 的大型数字集的运行平均值?