【问题标题】:Is float consistent across CPUs? [duplicate]跨 CPU 的浮点数是否一致? [复制]
【发布时间】: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_tdouble_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


【解决方案1】:

C 标准没有充分指定浮点语义来保证不同 C 实现之间的可重复性。 (如果 C 实现采用 Annex F 会有所帮助,但仍然不够,尤其是使用数学库中的各种超越函数时。)

获得可重现结果的技术包括将可移植性限制为提供 C 标准之外的保证的 C 实现,包括使用代码而不是使用本机库的必要数学库例程、用汇编语言编写以及限制使用的语言功能.

【讨论】:

    猜你喜欢
    • 2014-01-24
    • 2011-10-04
    • 2016-01-15
    • 2012-09-07
    • 1970-01-01
    • 1970-01-01
    • 2014-10-06
    • 1970-01-01
    相关资源
    最近更新 更多