带有整数参数的 std::pow,与整数类型相比

vso*_*tco 4 c++ floating-point c++11 floating-point-conversion

根据http://en.cppreference.com/w/cpp/numeric/math/pow,当std::pow与整数参数一起使用时,结果将提升为double.

我的问题如下:

将整数类型与 a 的结果进行比较有多安全std::pow(int1, int2)?例如,if下面的计算结果可以为 true 吗?

std::size_t n = 1024;
if(n != std::pow(2, 10))
    cout << "Roundoff issues..." << endl;
Run Code Online (Sandbox Code Playgroud)

也就是说,rhs 上的结果是否可能类似于 1023.99...9,因此转换为 size_t 时会变成 1023?

我的猜测是,答案是否定的,但我想确切地知道。我在检查矩阵维数等时使用这种比较,并且我不想std::round在任何地方使用 a 。

Pas*_*uoq 5

你应该问这个问题,这很有趣,因为StackOverflow 上的其他人提出了一个问题,这个问题是由于pow应用于小整数并没有在他们的平台上计算出明显的结果而引起的(另请参阅我的文章)。

所以是的,当应用于pow小整数时,参数和理想的数学结果都是可以精确表示的。这不会强制 的实现exp返回数学结果,因为没有标准规定pow不能由多个ULP导致不准确。至少有一个非常流行的平台默认提供了一个pow计算结果不是pow(10, 2)100 的函数,但你可以随意尝试pow(2, N),也许它总是会返回你有权期望的整数。

  • 除非你永远不应该使用“pow(2, N)”,因为“ldexp(1, N)”更好(更快并且保证结果准确) (6认同)