双零的数值稳定性
Numerical stability of double zero
我有一个包含非负双精度数的向量。我想区分条目等于零和条目大于零的情况。
仅检查 if(a>0.0) 在数值上是否安全,或者这会导致问题吗?除了机器精度外,我没有非零值的先验下限。我是否应该创建一个包含整数的辅助向量来标记零值以进行安全检查?
为了更好地理解:向量的条目类似于图上的权重,我想我不需要邻接矩阵来跟踪图拓扑。
编辑:我的问题是:0.0 能否并且将会以双精度表示?
浮点数字面意义上的邪恶。它们也不是由愚蠢的人设计的。您需要关心的唯一问题是 舍入。
设置为零的数字将为零。没有理由设计一个不以这种方式运行的计算系统。
设置为 0.1 的数字将不是 0.1,因为 0.1 不能精确表示,因此四舍五入到最接近的可表示数字;有关详细信息,请参阅 Is floating point math broken?。但是,如果将两个变量设置为 0.1,它们将相互比较相等,因为 0.1 每次都以相同的方式四舍五入。 (实际上舍入发生在编译期间;在运行时您只是将变量设置为预舍入值。)
同样,设置为0.1 * 3 - 0.3的数字可能不等于0,因为0.1被四舍五入,然后四舍五入的结果乘以3 that 结果四舍五入,依此类推。
所以问题不在于表示,而在于计算。如果您将某物设置为特定值,这就是它所具有的值。如果它通过一系列不精确的计算到达那里,你不能依赖完全相等。
我有一个包含非负双精度数的向量。我想区分条目等于零和条目大于零的情况。
仅检查 if(a>0.0) 在数值上是否安全,或者这会导致问题吗?除了机器精度外,我没有非零值的先验下限。我是否应该创建一个包含整数的辅助向量来标记零值以进行安全检查?
为了更好地理解:向量的条目类似于图上的权重,我想我不需要邻接矩阵来跟踪图拓扑。
编辑:我的问题是:0.0 能否并且将会以双精度表示?
浮点数字面意义上的邪恶。它们也不是由愚蠢的人设计的。您需要关心的唯一问题是 舍入。
设置为零的数字将为零。没有理由设计一个不以这种方式运行的计算系统。
设置为 0.1 的数字将不是 0.1,因为 0.1 不能精确表示,因此四舍五入到最接近的可表示数字;有关详细信息,请参阅 Is floating point math broken?。但是,如果将两个变量设置为 0.1,它们将相互比较相等,因为 0.1 每次都以相同的方式四舍五入。 (实际上舍入发生在编译期间;在运行时您只是将变量设置为预舍入值。)
同样,设置为0.1 * 3 - 0.3的数字可能不等于0,因为0.1被四舍五入,然后四舍五入的结果乘以3 that 结果四舍五入,依此类推。
所以问题不在于表示,而在于计算。如果您将某物设置为特定值,这就是它所具有的值。如果它通过一系列不精确的计算到达那里,你不能依赖完全相等。