0.1 + 0.2 != 0.3 是 IEEE 754 双精度浮点数无法精确表示十进制小数的必然结果,因二进制无限循环导致截断误差累积;应使用 abs(a - b) < eps 判断相等。
为什么0.1 + 0.2 != 0.30.10.2====!=bool equal(double a, double b, double eps = 1e-9) {
return std::abs(a - b) <= eps * std::max(1.0, std::max(std::abs(a), std::abs(b)));
}eps1e-151e-91e121e-9std::pow(x, 2)x * xstd::powstd::pow(x, 2)x * xstd::pow(x, 0.5)std::sqrt(x)ULP ≤ 0.5std::pow(x, 2)-O2std::accumulatea + (b + c)(a + b) + cstd::accumulate1e16 + 1.01e16double kahan_sum(const std::vector& v) {
double sum = 0.0, c = 0.0;
for (double x : v) {
double y = x - c;
double t = sum + y;
c = (t - sum) - y;
sum = t;
}
return sum;
} std::fmadd_realintdoubleintdoubleint i = 1000000000000000000LL * 1.0;double10000000000000000001000000000000000064static_cast(large_int) large_int90071992547409912^53 - 1