我正在pow
来电(#include <math.h>
),特别是pow(-1, Inf)
测试角落案例。
在我的桌面(Ubuntu)上,我得到结果1.0,这符合2008 IEEE浮点规范。
我在运行Android Gingerbread内核时运行相同的测试,并且我返回了NaN。
我环顾四周,可以看到在不同平台的标准库中确实有很多pow
的实现,在pow(-1, Inf)
的情况下,它们被编码以产生不同的结果。
问题是哪一个应该被认为是正确的?任何想法或想法?
如果我在错误的论坛上发帖,我道歉,我从android开发人员资源中获取了链接,最后来到这里。
答案 0 :(得分: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,但我们必须记住浮点数不是实数,事实上,对于所有人而言大浮点数y
,pow(-1,y)
为+1
。这是因为所有足够大的浮点数都是整数。从这个角度来看,将pow(-1,infinity)
定义为+1
是非常合理的,事实证明这在某些浮点计算中实际上会产生更多有用的行为。
有很多非常称职的数学家(以及非常熟练的程序员和编译器编写者)参与了C和IEEE-754委员会,他们并没有轻率地做出这些决定。每个标准都有错误,但这不是其中之一。