C++ FAQ lite "[29.17]为什么我的浮点比较不起作用?" 建议这个相等测试:
#include <cmath> /* for std::abs(double) */
inline bool isEqual(double x, double y)
{
const double epsilon = /* some small number such as 1e-5 */;
return std::abs(x - y) <= epsilon * std::abs(x);
// see Knuth section 4.2.2 pages 217-218
}
Run Code Online (Sandbox Code Playgroud)
+0和-0?|x| < epsilon?更新
正如Daniel Daranas所指出的那样,最好调用函数isNearlyEqual(我关心的是这种情况).
有人指出了这个链接,我想更加突出地分享.
根据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 。