38

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

这似乎将这些数组的排序速度加快了大约 40%,只要浮点数的位级表示是 IEEE 754,我的假设就成立。人们实际使用的现实世界中的 CPU(不包括在嵌入式设备中,这个库不针对)使用其他可能打破这个假设的表示?


4

5 回答 5

25

除了有缺陷的 Pentium之外,任何基于 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.

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

于 2010-02-10T04:55:40.853 回答
15

这取决于你在“现实世界”和想象世界之间划清界限的位置。

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

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

甚至还有一些人仍在使用DtCyber​​ 在(模拟的)控制数据大型机上运行 Plato,并使用其独特的浮点格式。(抱歉,我第一次认真编程是在 CDC Cyber​​ 机器上进行的,所以我忍不住提出来,即使它已经有几十年没有“真实世界”了)。

于 2010-02-10T05:24:36.323 回答
6

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

于 2010-02-10T04:56:10.540 回答
5

PowerPC processors (Macs until about 2006-2007, tons of current IBM servers) use a 128 bit format consisting of two doubles for long double, instead if the IEEE 754 extended format.

However, in C or Objective-C, there is no portable way to interpret a 32 bit or 64 bit floating point number as an integer (assuming float and uint32_t, or double and uint64_t have the same number of bits). When I needed to do that kind of thing, I had to write different code depending on the compiler (one was using a union, one was by casting double* to long long*). No idea whether a reinterpretcast in C++ will do it portably.

于 2014-08-30T21:52:15.673 回答
1

许多现实世界的 CPU 没有任何本机浮点格式。许多用于此类 CPU 的 C 和其他语言的实现捆绑了使用 IEEE-754 单精度和双精度格式并省略了扩展精度格式的库,尽管其他格式更适合许多用途。

于 2019-03-23T18:04:28.070 回答