我正在测试pow调用(#include <math.h>)上的角落案例,特别是pow(-1, Inf)。
在我的桌面(Ubuntu)上,我得到了结果1.0,这符合2008年IEEE浮点规范。
我在运行安卓姜饼内核时也会运行相同的测试,然后NaN就会返回。
我环顾四周,发现在不同平台的标准库中确实有许多pow实现,而在pow(-1, Inf)中,它们被编码以产生不同的结果。
问题是哪一个应该被认为是正确的?有什么想法或想法吗?
如果我在错误的论坛上发帖,我很抱歉,我跟踪了android开发者资源的链接,并在这里结束。
发布于 2011-09-14 00:25:13
C标准在这一点上非常清楚(§F.9.4.4);没有“想法或想法”的余地:
pow(−1,±∞)返回1。
附件F只适用于定义__STDC_IEC_559__的实现,但毫无疑问,1.0是正确的答案。
我怀疑这是一种已经渗透到NDK中的Java主义。( pow(-1,infinity)将NaN定义为NaN):
如果第一个参数的绝对值等于1,而第二个参数是无限的,则结果是NaN。
编辑:,因为Matteo反对这个“没有意义”,我会给出几句解释为什么委员会做出这个选择。虽然lim_{n->inf} (-1)^n在实数中不存在,但我们必须记住,浮点数不是实数,事实上,对于所有足够大的浮点数y,pow(-1,y)是+1。这是因为所有足够大的浮点数都是整数.从这个角度来看,将pow(-1,infinity)定义为+1是非常合理的,这实际上导致了一些浮点计算中更有用的行为。
参与C和IEEE-754委员会的数学家(以及非常熟练的程序员和编译器作者)数量惊人,他们不会轻率地做出这些决定。每个标准都有错误,但这不是其中之一。
https://stackoverflow.com/questions/7409082
复制相似问题