【发布时间】:2013-06-12 19:08:01
【问题描述】:
如果我在实现IEEE Standard for Floating-Point Arithmetic (IEEE 754) 的两种不同类型的 CPU 上运行完全相同的浮点计算序列(例如在 C 程序中),那么期望两个 CPU 返回相同的浮点数是否安全?
我问这个是因为不同的 CPU 包含具有不同中间大小的不同浮点单元(例如80bit FPU in certain x86 architectures),我需要确保跨多个不同 CPU 架构运行的模拟是确定性的,即在相同的情况下产生相同的结果无论架构如何,都是起点。
【问题讨论】:
-
将我的部分答案移至评论,因为有人关闭了问题:假设 IEEE 算术,几乎,但不完全。主要问题是:
-
1.精度过高。如果
FLT_EVAL_METHOD(来自float.h)不为0,则浮点表达式的计算类型可能大于其名义类型。这些类型由float_t和double_t给出。转换或存储到对象会降低多余的精度(四舍五入到实际的目标类型),但这并不总是与以所需精度执行原始计算相同的结果,因为 双舍入 . -
由于双舍入仅影响舍入到最近的模式,如果您可以在不同的舍入模式下运行计算,只要您小心丢弃所有多余的精度,这个问题就无关紧要了。
-
2.除了基本的算术运算和某些函数之外,IEEE 算术对其他函数的结果没有严格要求,尤其是超越函数。通常实现的目标是 1ulp 最大错误,但这并不能给出可重现的结果。你可以通过不使用数学库,只使用算术来避免这个问题。
-
@R.. 除了由编译环境设置的
FLT_EVAL_METHOD之外,还有FP_CONTRACT用户设置的pragma 允许或禁止使用更高(特别是无限) 计算过程中的精度。通常,这允许编译器生成融合乘加指令,其中源代码包含乘法和加法。这可以看作是精度过高的情况,但细节有所不同——例如,更改舍入模式并不能解决问题。 C99 中的 6.5:8、7.12.2:2。
标签: c floating-point ieee-754 cpu-architecture