它能保证双精度值 A/B 总是等于 A/B 吗?

Can it guarantee the double value A/B is always equal to A/B?

我们知道,由于double的精度有限,下面的两次计算可能不会给出完全相同的值:

A / B / C 和 A / ( B * C )

我的问题是即使有相同的两个变量 A 和 B,编译器能否保证每次 A / B 产生相同的值?

或者我应该在代码中问,我们能不能保证下面的语句总是return为真:

如果 ( A / B == A / B )

编译器的行为保证需要一些指定行为的文档。因此,答案取决于编程语言,并且,如果编程语言的规范不充分,则答案取决于所使用的特定编译器。

该问题没有指明任何特定的编程语言,更不用说任何特定的编译器了。一些编程语言的标准规定了它们行为的许多方面,而一些编程语言是非正式的,没有清楚地记录行为。

在后一类中,Python 表示 floating-point 行为源自 运行 所在的任何平台。所以我们不能轻易确定 Python 会做什么。

C standard is not completely clear about floating-point behavior. I opened 寻求澄清,到目前为止,我的解释是标准应该被解释为要求实现使用他们选择的一种格式来评估 floating-point特定类型,但编译器历来不符合这一点。例如,旧版本的 GCC 可以使用扩展精度评估表达式,但在不可预测的时间转换为标称精度。这可能导致 A/B == A/B 评估为 false(甚至不包括 NaN,出于此处讨论的目的我假设)。

Java specification 更具体地说明 floating-point 操作并指定符合 IEEE 754,但它指定 FP-strictnot FP-strict 模式,粗略检查表明 not FP-strict 模式 可能允许 A/B 比较不等于 A/B.