android内核libm pow(float,float)实现

Joh*_*ohn 3 c android ieee-754 android-ndk pow

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

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

我在运行Android Gingerbread内核时运行相同的测试,然后返回NaN.

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

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

我很抱歉,如果我在错误的论坛上发帖,我跟着android开发者资源的链接,最后来到这里.

Ste*_*non 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委员会,他们并没有轻率地做出这些决定.每个标准都有错误,但这不是其中之一.