C++:不一致的 std::pow( type ) 定义

标签 c++ definition pow

我正在使用 std::pow(std::complex)定义于 <cmath> ,返回 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)不同的号码类型选择不同?为所有类型使用唯一定义的幂函数的最佳方法是什么?

最佳答案

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

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

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

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


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

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

关于C++:不一致的 std::pow( type ) 定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51101420/

相关文章:

c# - 如何将 C# 数组传递给 C++ 并将其返回给 C# 以及其他项目?

c++ - 我如何让 .getline 每次都得到答案

c++ - 为什么一个int8_t的输出格式要用4个字节?

c++ - 如何增加 Visual Studio C++ 中的堆栈大小?

c - 当输入是复合时,在 C 中定义不起作用

C 的 pow() 不适用于可变指数

c++ - 编译器计算错误

javascript - 如何定义一个构造函数来生成具有 getter 和 setter 的对象?

git - "downstream"和 "upstream"的定义

c++ - 来自 math.h 的 pow 错误