【问题标题】:C++: Inconsistent std::pow( type ) definitionC++:不一致的 std::pow(type) 定义
【发布时间】:2018-06-29 12:08:42
【问题描述】:

我正在使用<cmath> 中定义的std::pow(std::complex),它返回nan。对于复杂的电源实现,我期望以下内容:

#include <complex>
#include <cmath>
cout << std::pow(std::complex(0.0, 0.0), 0) // should return (1, 0), but returns (nan,nan)

cout << std::pow(0.0, 0) // e.g. returns 1.0 as expected!

为什么std::pow(..., 0) 对不同号码类型的选择不同?对所有类型使用唯一定义的幂函数的最佳方法是什么?

【问题讨论】:

    标签: c++ definition pow


    【解决方案1】:

    00 应该理解为一个限制,而不是一个可以直接求值的算术表达式。

    在实数集上,这个极限“存在”(在这里简化)并且是 1,所以这就是你得到的结果。

    另一方面,在复数集上,你正在接近一个本质奇点;不存在可以分配给极限 00 的单个复数。 NaN 因此是唯一合理的结果。

    因此,如果您需要一致的幂函数,在实际情况下将 00 视为 NaN 也是合理的方法,因为设置 00 = 1无论如何,在实际算术中有些狡猾;虽然比复杂情况下要少。


    请注意,我在这里稍微简化了数学,但我将重复要带走的关键点:不存在对 0 有意义的结果0 解释为复数电源功能。
    这包括数字 1。对于数学上更严格的讨论,您可能需要查看 https://math.stackexchange.com/ 或其他更关注数学的资源。

    最后,值得注意的是std::pow(std::complex(0.0, 0.0), 0)的结果是实现定义的;以上是您的实施做出合理选择的理由。然而,从严格的 C++ 标准的角度来看,忽略这个问题的数学方面,1 也将是一个合规的结果,pi、-∞ 和 0 也是如此。

    【讨论】:

    • 即使在实数上,我也不喜欢 $0^0$ 被认为是有意义的东西。当然,当 x 趋于 0 时,$x^x$ 会收敛到 1,但它只是众多路径之一。例如 $lim_{x->0} 0^x$ 和 $lim_{x->0} 0^x$。
    • 我不同意。在这个问题中,很明显是“复杂^整数”的情况。不是“复杂^复杂”的。请注意在指数中使用“0”而不是“0.0”。当 n = 0 时,“z^n”显然是 1。否则复杂的幂级数将没有意义,整个数学领域也将无法工作。
    • @YSC 我不会反对这一点。我想说这只是实现用于对数学世界建模的简化之一,例如将 sqrt(-1) 设置为虚数单位。无论如何,在真实案例中比在复杂案例中更合理。
    • @BaummitAugen 我同意你的回答,只是有点吹毛求疵。
    • @AndreasH。来自&lt;complex&gt;std::pow 仅对复数进行运算,而std::complex 数字0 不编码其精确的整数性质,也不编码其到达的方向。因此,在 C++ 的上下文中,它自然不能准确地表示实数或复数算术,您的评论不会改变任何东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-20
    • 1970-01-01
    • 2018-09-24
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多