Floating point 这在浮点运算中是真的吗:如果a,b不是+;inf,-inf或NAN,a=b<=&燃气轮机;a-b=0

Floating point 这在浮点运算中是真的吗:如果a,b不是+;inf,-inf或NAN,a=b<=&燃气轮机;a-b=0,floating-point,Floating Point,假设a,b是两个不是+inf、-inf或NAN的64位浮点,我可以声明: a=b当且仅当a-b=0 如果是,为什么它总是保持不变?是的,这是真的(假设使用IEEE-754浮点,这在桌面架构中无处不在)。一个更有力、更普遍有用的说法,称为斯特本兹定理,说如果两个数字彼此的系数在2以内,那么它们的差可以精确地表示出来;你的陈述是一个特例 一个更容易的方法是考虑事情会如何出错。如果a!=b但是a-b四舍五入为零,那么a和b一定非常接近。事实上,它们之间的差异必须小于最小次正常值的一半。但这明显小于相邻

假设a,b是两个不是+inf、-inf或NAN的64位浮点,我可以声明:

a=b当且仅当a-b=0

如果是,为什么它总是保持不变?

是的,这是真的(假设使用IEEE-754浮点,这在桌面架构中无处不在)。一个更有力、更普遍有用的说法,称为斯特本兹定理,说如果两个数字彼此的系数在2以内,那么它们的差可以精确地表示出来;你的陈述是一个特例

一个更容易的方法是考虑事情会如何出错。如果
a!=b
但是
a-b
四舍五入为零,那么
a
b
一定非常接近。事实上,它们之间的差异必须小于最小次正常值的一半。但这明显小于相邻次正常数之间的距离!试图找到两个差舍入为零的不相等浮点数就像试图找到两个差舍入为零的不相等整数一样。

是的,这是真的(假设使用IEEE-754浮点,这在桌面架构中很普遍)。一个更有力、更普遍有用的说法,称为斯特本兹定理,说如果两个数字彼此的系数在2以内,那么它们的差可以精确地表示出来;你的陈述是一个特例


一个更容易的方法是考虑事情会如何出错。如果
a!=b
但是
a-b
四舍五入为零,那么
a
b
一定非常接近。事实上,它们之间的差异必须小于最小次正常值的一半。但这明显小于相邻次正常数之间的距离!试图找到两个差四舍五入为零的不相等浮点数就像试图找到两个差四舍五入为零的不相等整数。

不,一般情况下不是这样

如果浮点运算完全符合IEEE 754,则为真;如果非IEEE 754运算使用低于正常值或逐渐下溢,则为真

然而,IEEE 754并不总是全部使用。处理器具有将低于正常值的结果和/或低于正常值的输入更改为零的模式并不少见,操作系统(或程序初始化代码)默认情况下可启用此类模式以提高性能。在这种模式下,减去两个非常小的正常数将产生零,而不是IEEE 754规则下的次正常结果

至于它为什么成立,考虑浮点数字的一般格式。各个浮点系统的详细信息各不相同,但通常浮点数字是s•N•be,其中s(表示符号)是+1或−1,N(称为有效位)为非负整数,b为基数,e为指数。b是固定的,通常对N和e的范围有限制。我们还将假设浮点算术在可表示时返回精确的数学结果,而在不可表示时,返回用户选择的最接近的可表示值或特定方向上的较接近值

通常N是固定数量的base-b数字,例如,对于base-two格式为24位,在这种情况下为0≤ Na=biff
a-b==0
有效。要看到这一点,考虑两个正浮点数(其他符号的情况简单地)N0Be0和N1·Be1。在不丧失一般性的情况下,假设e0≤ e1。如果它们相等,则数学结果为零,由于这是可表示的,因此计算的浮点结果为零。如果它们不相等,则数学结果为(N0− N1•be1−e0)•be0。术语(N0− N1•be1−e0)可以是正的,也可以是负的,可以通过设置结果的符号来处理,并且可以大于或等于Nmax。无论情况如何,计算结果是否为零?没有,因为没有− N1•be1−e0是一个整数,因此,如果它不是0,则其大小至少为1,因此可表示值之一+1•be0或−1•be0比0更接近数学结果,因此永远不会选择0作为将结果四舍五入到最接近的可表示值的结果

因此,对于允许任意N的浮点系统,0≤ N 在某些浮点系统中会出现一个问题,因为N进一步受到约束。一个常见的要求是N必须为零,或者必须进行规范化,以使其前导数字不为零,这意味着N=0或bd−1.≤ 考虑这样的系统中减去两个数的结果(N0)− N1•be1−e0)•be0。术语N0− N1•be1−e0可能比bd小−1.为了解决这个问题,我们希望通过将该项乘以b,同时将be0项除以b来调整数字的表示形式。但指数是有界的;我们只能把它弄得这么小。如果e0太小,我们可能无法调整N项以适应bd−1.≤ N