【发布时间】:2014-11-15 01:35:56
【问题描述】:
根据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?
我的猜测是,响应中的一个很大的 NO,但想知道肯定。在检查矩阵等的维度时,我正在使用这些比较,并且我不想在任何地方使用std::round。
【问题讨论】:
-
2、10 和 1024 都可以用
double完美表示。只要输入和输出适合 53 位(假设 IEEE-754double),您应该没问题 -
@Praetorian 你应该告诉 user1257。 stackoverflow.com/questions/15851636/is-this-a-g-bug
-
@PascalCuoq 这很有趣,也很可怕。我无法在 gcc4.4.7、4.8、4.9 或 MinGW gcc4.9 上重现它;但最好能意识到这个问题。谢谢。
-
所以我想最安全的选择是在分配给整数类型之前使用
std::lround。谢谢大家的回答!
标签: c++ c++11 floating-point floating-point-conversion