根据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
。
答案 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例如gcc
和clang
将使用内置函数,这些函数可能会使用查找表或更简单的公式来处理这些琐碎的情况。我们可以使用godbolt查看上述情况,gcc
在编译时计算值:
movl $1024, %esi
正如问题C: i got different results with pow(10,2) and pow(10,j), j=2;所示,这些结果更可能是正确的。