是(x-x)始终为双的正零,还是有时为负零?


69

何时xdouble(x - x)保证是+0.0,或者有时可能是-0.0(取决于的符号x)?



21
@ Absurd-Mind太好了,现在测试所有其他doubles!;)
jtbandes 2014年

@AbsurdMind很好地回答了您的问题-并非总是如此。我也想知道,您需要知道什么情况?
ST3

@ ST3好吧,我不太在乎NaN,所以答案实际上是肯定的,如果x是有限的,则总是+0。在使用时很重要atan2
jtbandes 2014年

2
您还必须考虑到另一个线程可能会更改x的值。
延斯·蒂默曼

Answers:


61

x - x可以是+0.0NaN。舍入取整(在Java中,舍入模式始终为舍入取整)在IEEE 754算术中没有其他值。将两个相同的有限值相减定义+0.0在此舍入模式下产生。马克·迪金森Mark Dickinson)在下面的评论中引用了IEEE 754标准第6.3节:

当两个具有相反符号的操作数之和(或两个具有相似符号的操作数之差)正好为零时,除roundTowardNegative [...]以外,所有舍入方向属性中该和(或差异)的符号应为+0。 。

页面显示,特别是0.0 - 0.0-0.0 - (-0.0)+0.0

从它们的减去中,无限和NaN都会产生NaN。


2
您能否解释为什么“四舍五入”表示+0.0唯一的可能性(当不涉及NaNs和Infs时)?哪里有记录表明Java总是使用取整法?
jtbandes 2014年

@jtbandes并不是说四舍五入就意味着+0.0是结果,只是两次相减的结果是在四舍五入中以此方式定义的(但对于其他舍入没有这种方式的定义)模式)。关于舍入模式,我的资料来源是cs.berkeley.edu/~wkahan/JAVAhurt.pdf
Pascal Cuoq

5
@jtbandes:零的符号在IEEE 754标准的第6.3节中明确指定:“当两个具有相反符号的操作数之和(或两个具有相似符号的操作数之差)正好为零时,该和的符号(或差异)在所有取整方向属性中应为+0,而不是roundTowardNegative [“]
马克·迪金森

9

SMT求解器Z3支持IEEE浮点算法。让我们问Z3找到一个案例x - x != 0。立即找到NaN+-infinity。除了这些,没有x一个满足该方程式。

(set-logic QF_FPA)    

(declare-const x (_ FP 11 53))
(declare-const r (_ FP 11 53))

(assert (and 
    (not (= x (as NaN (_ FP 11 53))))
    (not (= x (as plusInfinity (_ FP 11 53))))
    (not (= x (as minusInfinity (_ FP 11 53))))
    (= r (- roundTowardZero x x))
    (not (= r ((_ asFloat 11 53) roundTowardZero 0.0 0)))
))

(check-sat)
(get-model)

Z3通过将所有操作转换为布尔电路并使用标准的SAT求解器来找到模型来实现IEEE浮点算法。除非翻译或SAT求解器中有任何错误,否则结果非常精确。

证明...

请注意舍入模式的反例roundTowardNegativehttp : //rise4fun.com/Z3/T845。对于肯定x的结果x - x是负零。人类几乎找不到这种情况。但是,使用SMT求解器很容易找到。我们可以更改=为,==以便Z3使用IEEE相等比较语义而不是完全相等。更改之后,再也没有反例了,因为-0 == +0根据IEEE。

我尝试将舍入模式设置为变量。从理论上讲,这是可行的,但是Z3在这里有一个bug。现在,我们必须手动指定硬编码的舍入模式。如果我们可以将其设为变量,则可以要求Z3在一个查询中针对所有舍入模式证明该语句。


整齐。但是我得到了Z3(15, 10): ERROR: model is not available
jtbandes 2014年

@jtbandes模型将表明我们理论的反例。由于没有可用的反例,因此我们没有模型,理论也没有成立。我已经编辑了get-model调用。
usr

您要roundNearestTiesToEven代替roundTowardZero吗?
Mark Dickinson 2014年

难道不应该找到1 /(xx)!= 1 / 0.0的情况吗?否则,我认为(-1 * 0.0)等于0.0,不是吗?
supercat

@supercat根据IEEE标准=进行精确比较==rise4fun.com/Z3/UgPo在他们的两个断言和评论一个玩。
USR
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.