std :: pow with integer parameters,与整数类型进行比较

时间:2014-11-15 01:35:57

标签: c++ c++11 floating-point floating-point-conversion

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

我的问题是:

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

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

也就是说,rhs上的结果可能是1023.99 ... 9的结果,所以当转换为size_t变为1023时?

我的猜测是在一个很大的回应,但想知道肯定。我在检查矩阵的维度等时使用这种比较,我不想在任何地方使用std::round

4 个答案:

答案 0 :(得分:4)

你应该问一下这很有意思,因为someone else on StackOverflow有一个问题是由pow应用于小整数而不是在他们的平台上计算明显结果的事实引起的(另见my { {3}})。

所以是的,当将pow应用于小整数时,参数和理想数学结果都可以完全表示。这并不强制exp的实现返回数学结果,因为没有标准指定pow不能被多个writeup不准确。默认情况下,至少有一个非常受欢迎的平台提供pow函数,该函数不会将pow(10, 2)计算为100,但您可以自由地利用pow(2, N)带来机会,也许它会发生在返回您有权期望的整数。

答案 1 :(得分:3)

当结果可以精确表示时,

pow对整数参数应该一直给你正确的答案。问题是,它没有。有现代平台(很多Linux发行版,例如旧的和近期的),但它没有。找到一堆SO问题并不难,人们会给pow非常好的输入并且它会返回一个非常错误的答案。

答案 2 :(得分:0)

对于该特定示例,它应始终返回false,尤其是因为您使用的是int类型,因此不会出现舍入错误。

您希望对舍入错误保持谨慎的地方是,您要比较两个不同的算术函数,这些函数返回带有长小数的浮点数或双精度数。很多时候,由于不同的舍入和不同的操作,它们会返回不平等。

答案 3 :(得分:0)

正如几个答案所指出的那样,尽管数量很少,结果应该是完全可以表示的,但是有一些低质量的实现。

对于使用 const表达式的情况,例如:

std::pow(2, 10)

许多编译器将使用builtin functions例如gccclang将使用内置函数,这些函数可能会使用查找表或更简单的公式来处理这些琐碎的情况。我们可以使用godbolt查看上述情况,gcc在编译时计算值:

movl    $1024, %esi     

正如问题C: i got different results with pow(10,2) and pow(10,j), j=2;所示,这些结果更可能是正确的。