Tag: 舍入错误

比较C或C ++中两个浮点值的总和

假设您有两组根据IEEE754实现的浮点变量,意味着将其视为根据标准中的公式计算的精确值。 所有合法价值都是可能的。 集合中的变量数量可以是任何自然数。 在数学意义上,比较精确的由所述变量表示的值的总和的好方法。 由于域的性质,问题可以很容易地表示为将单个总和与零进行比较。 您可以忽略存在NaN或无限的可能性,因为它与核心问题无关。 (可以轻松独立地检查这些值,并以适合此问题的特定应用的方式采取行动。) 一种天真的方法是简单地求和和比较,或者将一组的值和另一组的值相加。 bool compare(const std::vector& lhs, const std::vector& rhs) { float lSum = 0.0f; for (auto value : lhs) { lSum += value; } float rSum = 0.0f; for (auto value : rhs) { rSum += value; } return lSum < rSum; } 很明显天真方法存在问题,如关于浮点运算的各种其他问题中所提到的。 大多数问题都与两个困难有关: 浮点值的相加结果根据顺序而不同 添加某些值集的某些顺序可能导致中间溢出(计算的中间结果超出可用数据类型支持的范围) float small […]

通过0.0时减去浮点数时出错

以下程序: #include int main() { double val = 1.0; int i; for (i = 0; i < 10; i++) { val -= 0.2; printf("%g %s\n", val, (val == 0.0 ? "zero" : "non-zero")); } return 0; } 生成此输出: 0.8 non-zero 0.6 non-zero 0.4 non-zero 0.2 non-zero 5.55112e-17 non-zero -0.2 non-zero -0.4 non-zero -0.6 non-zero -0.8 […]