3

我正在测试powcall( #include <math.h>) 的极端情况,特别是pow(-1, Inf).

在我的桌面(Ubuntu)上,我得到了 1.0 的结果,这符合 2008 IEEE 浮点规范。

我在运行 Android Gingerbread 内核时运行了相同的测试,并且返回了 NaN。

我环顾四周,可以看到在不同平台的标准库中确实有许多实现,pow并且在pow(-1, Inf)它们被编码以产生不同结果的情况下。

问题是哪一个应该被认为是正确的?任何想法或想法?

如果我在错误的论坛上发帖,我深表歉意,我点击了 android 开发人员资源中的链接并最终来到了这里。

4

1 回答 1

7

C 标准在这一点上非常清楚(§F.9.4.4);没有“想法或想法”的空间:

pow(−1, ±∞) 返回 1。

附件 F 仅在实现定义时适用__STDC_IEC_559__,但毫无疑问 1.0 是正确答案。

我怀疑这是一种已泄漏到 NDK 中的 Java 主义。(Java定义pow(-1,infinity)NaN):

如果第一个参数的绝对值等于 1,而第二个参数是无限的,则结果为 NaN。

编辑: 由于 Matteo 反对这“没有意义”,我将提供几句话来解释为什么委员会做出这个选择。虽然 lim_{n->inf} (-1)^n 不存在于实数中,但我们必须记住浮点数不是实数,事实上,对于所有足够大的浮点数ypow(-1,y)+1。这是因为所有足够大的浮点数都是偶数。pow(-1,infinity)从这个角度来看,将 定义为是非常合理的+1,事实证明这实际上会在某些浮点计算中导致更有用的行为。

C 和 IEEE-754 委员会都参与了数量惊人的非常称职的数学家(以及非常熟练的程序员和编译器编写者),他们不会轻率地做出这些决定。每个标准都有错误,但这不是其中之一。

于 2011-09-14T00:25:13.707 回答