6

为什么不是1/0 == Inf所有语言?这不是数学上最正确的反应吗?

我熟悉的所有语言都能够表达 Infinite 和 NaN 值,那么为什么他们会选择抛出错误或返回 NaN 呢?仅仅是为了让科学应用程序开发人员的生活更加艰难吗?;-)

更新:我们可能应该关闭这个问题,因为我错误地认为1f/0f == Float.NaN在 Java 中。但我错了:它确实正确返回Float.Infinity. 那是我的主要困惑。某些语言会抛出错误这一事实是可以理解的,只要没有语言返回 NaN。

4

9 回答 9

18

除了 1 / 0 == inf 在数学上非常有问题之外,它在大多数编程语言中不起作用的简单原因是它几乎普遍1 / 0执行整数除法(存在例外)。

结果是一个整数,根本无法将“无穷大”编码为整数。有浮点数,这就是为什么浮点除法实际上会在大多数语言中产生无限值的原因。

NaN 也是如此:虽然 IEEE 浮点标准定义了表示 NaN 值的位模式,但整数没有这样的值;因此,这些值根本不能表示为整数。

于 2011-07-03T15:48:24.917 回答
3

虽然1 / n随着 n 接近零(从正方向), 的极限趋于无穷大,但原因1 / 0 <> Inf是 1 / 0 是 未定义的(通过数学定义!)。

于 2011-07-03T15:37:06.013 回答
3

这不是数学上最正确的反应吗?

不,因为在数学中,除以零是未定义的,并且无穷大通常不是一个值(或不是单个值)。

并非所有语言/库都返回 NaN 的原因是(a)零除通常是程序员错误的结果,因为它根本不应该在数学上严格的算法中发生,并且(b)处理器可能会通过去处理它进入异常状态,因此转换为 NaN 将需要处理此类状态,这意味着除法变得比现在更加昂贵(与求和相比)。

于 2011-07-03T15:37:16.707 回答
2

为什么要拖钓?但我会咬人。这可能会因您构建运算符的方式而异,但定义除法的最传统方式只是乘法的逆函数。也就是说,c = a/b 被定义为 c 是唯一数,使得 c*b = a。

现在考虑 c = 1/0。是否存在唯一的 c 使得 c*0 = 1?当然不在 R 或 C 中。如果我们引入无穷大呢?你可以有一个特殊的情况,说 0*Infinity = 1。但是你破坏了乘法运算符的一堆很好的属性。也就是说,我们想要 2*(0*Infinity) = 2*1 = 2。但我们也想要关联属性。所以 (2*0)*Infinity = 0*Infinity = 1。

通常,无论如何都不能将 Field 扩展为具有 0 的乘法倒数,从而保留您想要的属性。

也就是说,我假设您介绍了经典的 1/0 = Infinity 只是为了巨魔。下一个问题,为什么语言不承认 0.9 的中继器不等于 1。

于 2011-07-03T17:08:40.553 回答
1

0/0或者怎么样-1/0?如果你犯了错误怎么办?用结果来表示程序零除法不是一个好主意Inf

于 2011-07-03T15:37:44.373 回答
1

在 Java 交互窗格中,我看到了这一点。

Welcome to DrJava.  Working directory is /Users/morrison/Desktop/PhotoPuzzle
> int top = 1;
> int bottom = 0;
> top/bottom
java.lang.ArithmeticException: / by zero
> double topFloat = 1;
> double bottomFloat = 0;
> topFloat/bottomFloat
Infinity
> 

浮点数是不精确的,可能非常接近于零。将整数设为零可能被视为程序员的愚蠢行为。这些可能是您看到的两种不同的行为。

于 2011-07-03T15:39:57.160 回答
1

浮点运算可以检测几种异常情况并以几种不同的方式做出反应:

  • 设置可以稍后测试的状态标志。
  • 立即生成陷阱。

第一种操作模式允许高性能,而第二种模式允许立即通知可能的错误操作。

IEEE 754 为引发异常的操作结果定义了一些合理的值(例如:被除数有限的非零数和除数为零→正确签名的 INFINITY;0/0→安静的 NaN)。

带有陷阱的 IEEE 754 意图是,会有用户模式处理程序可以检查操作、操作数(对于无效操作和除以零异常)或结果(对于溢出、下溢和不精确异常)和异常标志并返回一个新的用户定义结果。

实际上,有些语言甚至不支持访问异常状态标志,更不用说设置陷阱处理程序了。

即使 C 为陷阱处理程序提供了非常原始的支持,C99 甚至没有定义设置陷阱模式的可移植方式,例如:将一些实现定义的值传递给fesetenv(). 实现通常会引发 SIGFPE,并且用户通常需要访问依赖于 CPU 的状态来实现类似 IEEE-754 的陷阱处理程序。

于 2011-07-03T17:22:57.233 回答
0

因为虽然1 / 0有时可以近似为 INF或其他类似的值,但它并没有正式定义为这样。在同一条战线上是10 / 0 < 20 / 0?或0 / 0

于 2011-07-03T15:38:48.367 回答
0

除法a | b本身没有为b = 0. 因此,此操作的实现将这种情况映射到一个特殊值,以表达这个概念。

于 2011-07-03T15:38:48.463 回答