任何真实的CPU都不使用IEEE 754吗?

dsi*_*cha 31 sorting floating-point performance ieee-754

我正在优化数值/统计库的排序函数,基于这样的假设:在过滤掉任何NaN并进行一些微调之后,可以将浮点数作为32位整数进行比较而不改变结果,并且可以将双精度数据进行比较64位整数.

这似乎加速了这些数组的排序大约40%,并且只要浮点数的位级表示是IEEE 754,我的假设就成立.是否存在人们实际使用的真实CPU(不包括在嵌入式设备中,这个库没有针对哪个)使用其他可能会破坏这种假设的表示?


And*_*ore 21

除了有缺陷的Pentiums之外,任何基于x86或x64的CPU都使用IEEE 754作为其浮点算术标准.

以下是FPA标准及其采用的简要概述.

IEEE 754:       Intel x86, and all RISC systems (IBM Power
                and PowerPC, Compaq/DEC Alpha, HP PA-RISC,
                Motorola 68xxx and 88xxx, SGI (MIPS) R-xxxx,
                Sun SPARC, and others);

VAX:            Compaq/DEC

IBM S/390:      IBM (however, in 1998, IBM added an IEEE 754
                option to S/390)

Cray:           X-MP, Y-MP, C-90; other Cray models have been
                based on Alpha and SPARC processors with
                IEEE-754 arithmetic.
Run Code Online (Sandbox Code Playgroud)

除非您计划在相当奇特的CPU架构上支持您的库,否则可以安全地假设现在99%的CPU符合IEEE 754标准.

  • 它有所不同.您列表中的许多实际架构实现几乎都支持IEEE754,但是有一些注意事项,例如没有完整的NaN集,迫使denorms为零,ULP或乘法/除法结果中的两个错误,乘法因ULP而异或者两个取决于操作数顺序等.因此"99%的CPU符合IEEE754标准"需要免责声明 - 精神是真实的,并且出于问题的目的,你是正确的,但一般来说,魔鬼往往是详细的.更像是,99%的CPU符合IEEE754标准. (18认同)
  • [标准委员会关心的奇异架构](http://stackoverflow.com/q/6971886/995714) (2认同)
  • @phuclv:完全支持 IEEE-754 语义的架构可能会很昂贵,这并不是什么稀奇古怪的事情。即使在现代 CPU 上,必须处理无穷大、NaN 和非正规数的所有可能极端情况的代码通常也会比可以通过稍微改变此类行为的方式进行优化的代码慢得多。 (2认同)

Jer*_*fin 14

这取决于你在"真实世界"和虚构世界之间画线的位置.

  1. Alpha机器仍然支持Vax G格式(惠普表示他们将至少支持2013年).
  2. IBM十六进制FP仍受IBM z系列大型机的支持.他们添加了IEEE二进制和十进制支持,但据我所知,它们很少使用,因为十六进制FP速度要快得多(IBM已经将它优化了大约45年了......)

直到最近,Unisys仍然销售支持Burroughs FP格式的ClearPath IX服务,以及支持Univac FP格式的ClearPath MCP机器.我相信这些现在只能在仿真中运行(在Xeons上),但从软件的角度来看,它们可能会在未来十年或更长时间内继续使用.

甚至有一些人使用DtCyber在(模拟的)控制数据大型机上运行Plato,并使用其独特的浮点格式.(对不起,但我的第一个认真编程是在CDC网络机器上,所以我无法抗拒它,即使它已经不是"现实世界"几十年了).


cel*_*ion 6

单元处理器的 SPU在几个方面有所不同(例如缺少 INF 和 NAN),但我认为这些差异不会破坏您的假设......

  • 好点子。ARM-Neon SIMD-Unit(用于较新的 iPhone 和其他移动设备)在一些方面也有所不同。不过,CPU 能够在 VPF 模式下执行一致的浮点计算。哦,MIPS R5900(PlayStation 2)也有一些问题。最值得注意的是乘法的最后一个尾数位是未定义的。 (6认同)
  • 我目前在我的办公桌上有三个独立的嵌入式硬件与三个不同的 PowerPC 派生 CPU 一起工作,这些 CPU 以三种不同的方式不兼容...... (5认同)

gna*_*729 5

PowerPC 处理器(大约 2006-2007 年之前的 Mac,目前有大量 IBM 服务器)使用 128 位格式,其中包含两个双精度双精度数,而不是 IEEE 754 扩展格式。

但是,在 C 或 Objective-C 中,没有可移植的方式将 32 位或 64 位浮点数解释为整数(假设 float 和 uint32_t,或 double 和 uint64_t 具有相同的位数)。当我需要做那种事情时,我不得不根据编译器编写不同的代码(一个是使用联合,一个是将 double* 转换为 long long*)。不知道 C++ 中的重新解释是否可以移植。

  • 1980 年代的 Macintosh “Standard Apple Numerical Environment”使用 32、64 和 80 位浮点类型,其中 80 位类型最快,因为指数和尾数可以轻松加载到寄存器中而无需位掩码,而我不知道 SANE 是否利用了这一事实,延迟归一化可以避免有时可能是重复浮点加法中最慢的部分之一。 (2认同)