C++:不一致的 std::pow( 类型 ) 定义
C++: Inconsistent std::pow( type ) definition
我正在使用 <cmath>
中定义的 std::pow(std::complex)
,其中 returns 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 应理解为一个极限,而不是可以直接计算的算术表达式。
在实数集上,这个极限"exists"(这里简化)为1,所以这就是你得到的结果。
另一方面,在复数集上,你正在接近一个本质奇点;不存在可以分配给极限 00 的单个复数。因此,NaN
是唯一合理的结果。
因此,如果您需要一致的幂函数,在实际情况下将 00 视为 NaN 也是合理的方法,因为设置 0无论如何,0 = 1 在实际算术中有点狡猾;尽管比复杂的情况要少。
请注意,我在这里稍微简化了数学运算,但我将重复要删除的关键点:不存在对 00[= 有意义的结果的数字33=] 解释为复幂函数。
这包括数字 1。对于数学上更严格的讨论,您可能需要查看 https://math.stackexchange.com/ 或其他更注重数学的资源。
最后,值得注意的是 std::pow(std::complex(0.0, 0.0), 0)
的结果是实现定义的;以上是您的实施做出合理选择的理由。但是,从严格的 C++ 标准的角度来看并忽略此问题的数学方面,1 也是符合要求的结果,pi、-∞ 和 0 也是如此。
我正在使用 <cmath>
中定义的 std::pow(std::complex)
,其中 returns 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 应理解为一个极限,而不是可以直接计算的算术表达式。
在实数集上,这个极限"exists"(这里简化)为1,所以这就是你得到的结果。
另一方面,在复数集上,你正在接近一个本质奇点;不存在可以分配给极限 00 的单个复数。因此,NaN
是唯一合理的结果。
因此,如果您需要一致的幂函数,在实际情况下将 00 视为 NaN 也是合理的方法,因为设置 0无论如何,0 = 1 在实际算术中有点狡猾;尽管比复杂的情况要少。
请注意,我在这里稍微简化了数学运算,但我将重复要删除的关键点:不存在对 00[= 有意义的结果的数字33=] 解释为复幂函数。
这包括数字 1。对于数学上更严格的讨论,您可能需要查看 https://math.stackexchange.com/ 或其他更注重数学的资源。
最后,值得注意的是 std::pow(std::complex(0.0, 0.0), 0)
的结果是实现定义的;以上是您的实施做出合理选择的理由。但是,从严格的 C++ 标准的角度来看并忽略此问题的数学方面,1 也是符合要求的结果,pi、-∞ 和 0 也是如此。