双零点的数值稳定性

时间:2015-09-03 13:20:24

标签: c++ vector floating-point double

我有一个包含非负双打的向量。我希望区分条目等于零和条目大于零的情况。

检查是否(a>> 0.0)或者这是否会导致问题在数值上是否安全?除了机器精度之外,我没有非零值的先验下限。我应该创建一个包含整数的辅助向量来标记零值以进行安全检查吗?

为了更好地理解:向量的条目类似于图形上的权重,我认为我不需要邻接矩阵来跟踪图形拓扑。

编辑:我的问题是:可以和将0.0在双打中完全表示吗?

1 个答案:

答案 0 :(得分:4)

浮点数不是字面意思。它们也不是由愚蠢的人设计的。您需要关注的唯一问题是舍入

设置为零的数字将为零。没有理由设计一个没有这种方式的计算系统。

设置为0.1的数字不会是0.1,因为0.1不能完全表示,因此四舍五入到最接近的可表示数字;有关详细信息,请参阅Is floating point math broken?。但是如果你将两个变量设置为0.1,它们将相互比较相等,因为0.1每次都以相同的方式舍入。 (事实上​​,在编译期间会进行舍入;在运行时,您只需将变量设置为预舍入值。)

类似地,设置为0.1 * 3 - 0.3的数字可能不等于零,因为0.1被舍入,然后舍入结果乘以3而 结果被舍入,等等。

所以这个问题不是表示问题,而是计算问题。如果您将某些内容设置为某个特定值,那就是它具有的值。如果它通过一系列不精确的计算到达那里,你就不能依赖于完全相等。