众所周知,由于double的精度有限,以下两个计算可能无法给出完全相同的值:
A / B / C和 A /(B * C)我的问题是即使是相同的两个变量A& B,编译器可以保证每次A / B产生相同的值吗?
或者我应该在代码中询问,我们是否可以保证以下语句始终返回true:
如果(A / B == A / B)
答案 0 :(得分:1)
编译器的行为保证需要一些指定行为的文档。因此,答案取决于编程语言,如果编程语言的规范不充分,答案取决于所使用的特定编译器。
这个问题没有确定任何特定的编程语言,更不用说任何特定的编译器了。一些编程语言具有指定其行为的许多方面的标准,而一些编程语言是非正式的,并不清楚地记录行为。
在后一类中,Python表示浮点行为是从它运行的任何平台派生出来的。所以我们不能轻易确定Python会做什么。
C standard并不完全清楚浮点行为。我打开this question寻求澄清,到目前为止,我的解释是标准应该被解释为要求实现使用他们选择的一种格式来评估特定类型的浮点运算,但编译器有在历史上并不符合这一点。例如,较旧版本的GCC可以使用扩展精度计算表达式,但在不可预测的时间转换为标称精度。这可能会导致A/B == A/B
评估为假(甚至排除NaN,我在此讨论这些内容)。
Java specification更具体地说明了浮点运算并指定了与IEEE 754的一致性,但它指定了 FP-strict 和而不是FP-strict 模式,粗略检查表明不是FP严格模式可以允许A/B
比较不等于A/B
。