C 中的浮点精度怪癖
C 中的浮点运算表现出可能违反直觉的行为。考虑以下内容:
表达式 double a = 0.3;将逻辑上表示 0.3 的值赋给变量 a。然而, std::cout 的输出
同样,在 a 与 b 重复相加的循环中,循环结束时的结果(50 次迭代)是“15.000000000000014211”,该值高于应有的值。此结果演示了舍入误差如何在多次运算中累积。
为了规避这些精度问题,避免将浮点值的精度设置为高于数据类型的实际精度非常重要。这可以使用以下方法来实现:
<code class="cpp">#include <iostream> #include <limits> int main() { double a = 0.3; std::cout.precision(std::numeric_limits<double>::digits10); std::cout << a << std::endl; double b = 0; for (char i = 1; i <= 50; i++) { b = b + a; } std::cout.precision(std::numeric_limits<double>::digits10); std::cout << b << std::endl; }</code>
通过将精度设置为双精度数据类型的最大可用精度,输出将准确表示存储的值。然而,如果循环运行明显更多的迭代次数(例如 5000 次而不是 50 次),由于浮点运算的固有限制,累积误差仍然会变得明显。
以上是为什么 C 语言中的浮点运算会导致精度问题?的详细内容。更多信息请关注PHP中文网其他相关文章!