【问题标题】:android kernel libm pow(float,float) implementationandroid 内核 libm pow(float,float) 实现
【发布时间】:2011-09-13 22:01:29
【问题描述】:

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

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

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

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

问题是哪一个应该被认为是正确的?有什么想法或想法吗?

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

【问题讨论】:

    标签: android c android-ndk ieee-754 pow


    【解决方案1】:

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

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

    仅当实现定义了__STDC_IEC_559__ 时,附件 F 才适用,但毫无疑问 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 委员会中都有相当多的非常称职的数学家(以及非常熟练的程序员和编译器编写者),他们不会轻率地做出这些决定。每个标准都有错误,但这不是其中之一。

    【讨论】:

    • 从数学上讲这是没有意义的,因为对于 a+inf 的限制;如果它在我的权力范围内,那就是 NaN。
    • @Matteo:浮点数不是实数。 C 委员会和 IEEE-754 委员会在选择标准化我们所做的行为之前都仔细考虑了这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多