为什么我的 double 可以包含低于机器 epsilon 的值?

Why my double can contain a value below the machine epsilon?

我正在使用双精度解方程,我得到 -7.07649e-17 而不是 0

我同意它足够接近,我可以说它是相等的,但是 I've read that the machine epsilon for the C++ double type is 2^-52 比我得到的值大。

那么为什么我的值比机器 epsilon 低? 为什么该值不四舍五入为零?

这没什么大不了的,但是当我进行逻辑测试时,我的值似乎不为零...

浮点精度问题的常见解决方案是自己定义一个 epsilon 值并与该值而不是零进行比较。

例如

double epsilon = 0.00001;
if (abs(value) < epsilon) // treat value as 0 in your code

您无法保证在任何特定时间都会进行四舍五入。 C++ 标准允许实现在几乎任何它想要的地方使用额外的精度,许多现实世界的实现正是这样做的。

这个故事中有两个不同的常量。一个是 epsilon,它是一个最小值,当添加到 1.0 时会产生不同于 1.0 的值。如果将较小的值添加到 1.0,您将再次得到 1.0,因为计算机中数字的表示存在物理限制。但是有些值小于 epsilon 且大于零。使用 std::numeric_limits<double>::min.

得到的 double 的最小数字

作为参考,您可以使用 std::numeric_limits<double>::epsilon.

获得 epsilon