Language agnostic 对于任何有限浮点值,是否保证x-x==0?
值是不精确的,这就是为什么我们在比较中很少使用严格的数字相等。例如,在Java中,它打印Language agnostic 对于任何有限浮点值,是否保证x-x==0?,language-agnostic,floating-point,precision,ieee-754,signedness,Language Agnostic,Floating Point,Precision,Ieee 754,Signedness,值是不精确的,这就是为什么我们在比较中很少使用严格的数字相等。例如,在Java中,它打印false(): 通常比较浮点计算结果的正确方法是查看与某些期望值的绝对差值是否小于某些允许值 System.out.println(Math.abs(.1+.2-.3)
false
():
通常比较浮点计算结果的正确方法是查看与某些期望值的绝对差值是否小于某些允许值
System.out.println(Math.abs(.1+.2-.3)<.00000000000001);
//真的
问题在于某些操作是否能产生准确的结果。我们知道,对于任何非有限浮点值x
(即NaN
或无穷大),x-x
但是,如果x
是有限的,那么这有保证吗
x*-1==-x
x-x==0
不管它值多少钱,我认为(我可能错了)答案是肯定的!我认为这可以归结为是否对于任何有限浮点值,它总是可以精确计算的。由于例如
float
和double
具有,因此情况似乎是这样的,因为它只需要翻转符号位即可找到加法逆(即,应保持原样)
相关问题
x-x
和x*-1
的结果都可以精确地表示为与x
精度相同的浮点数,因此IEEE 754浮点值保证了这两个等式。在这种情况下,无论舍入模式如何,都必须由兼容的实现返回准确的值
编辑:与.1+.2
示例进行比较
您无法在IEEE 754中添加.1
和.2
,因为您无法将它们表示为传递给+
。加法、减法、乘法、除法和平方根返回唯一的浮点值,该值取决于舍入模式,紧靠下,紧靠上,与处理关系的规则最接近,…,这是对R中相同参数的运算结果。因此,当结果(在R中)恰好可以表示为浮点数时,无论采用何种舍入模式,该数字都会自动成为结果
编译器允许您编写0.1
作为不同的、可表示的数字的简写,而无需警告,这一事实与这些操作的定义是正交的。例如,当您编写-(0.1)
时,-
是精确的:它返回与其参数完全相反的值。另一方面,它的参数不是0.1
,而是编译器使用的double
简言之,
x*(-1)
操作之所以准确,另一个原因是-1
可以表示为双精度,尽管x-x
可能会给你-0
而不是真的0
,-0
比较起来等于0
,所以你可以放心地假设,任何一个有限数减去它本身,就等于零
有关更多详细信息,请参阅。部分原因是,减法和乘法以及加法、除法和平方根运算是IEEE 754强制要求“最优”结果的基本运算之一。因此,“最优”的定义需要澄清,因为您可以说它可能是“最优”的对于.1+.2==.3
,但我认为这在所有IEEE-754双重实现中都是错误的(除非我在其他一些问题上遗漏了)。这个问题有点伤我的大脑,所以我无法做出贡献,但我刚刚查看了你到ideone.com的链接。。。这个网站看起来很酷!可能是Wowee的复制品!我投票决定结束我自己的问题。
System.out.println(.1 + .2 == .3);
// false
System.out.println(Math.abs(.1 + .2 - .3) < .00000000000001);
// true