4

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

我同意它足够接近,我可以说它相等,但我读过 C++ 双精度类型的机器 epsilon2^-52大于我得到的值。

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

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

4

3 回答 3

5

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

作为参考,你会得到 epsilon 和std::numeric_limits<double>::epsilon.

于 2017-04-28T11:14:44.110 回答
0

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

于 2017-04-28T11:00:15.577 回答
-4

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

例如

double epsilon = 0.00001;
if (abs(value) < epsilon) // treat value as 0 in your code
于 2017-04-28T10:58:12.430 回答