2010-02-10 68 views
27

我正在優化數值/統計庫的排序功能,基於這樣的假設,在過濾掉任何NaN並做一點點旋轉之後,可以將浮點數比較爲32位整數,而不更改結果,雙精度可以是比較爲64位整數。是否有任何真實世界的CPU不使用IEEE 754?

這似乎加快了將這些數組排列在40%左右的數量級,並且只要浮點數的位級表示是IEEE 754,我的假設就會成立。是否有任何真實世界的CPU實際使用(不包括在此庫不適用的嵌入式設備中)是否使用了可能會破壞此假設的其他表示形式?

+0

非常有趣 - 你能詳細說明你如何將它們作爲整數進行比較嗎? – Saideira 2012-03-20 15:59:48

回答

17

flawed 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. 

除非你上相當奇特的CPU架構,支持你的庫規劃,它是安全的假設,現在99%的CPU是IEEE 754標準。

+14

它有所不同。列表上架構的許多實際實現幾乎支持IEEE754,但有些警告像沒有完整的NaNs,強制變量爲零,ULP或乘法/除法結果中的錯誤爲2,乘法因ULP而不同或兩個取決於操作數的順序等等。所以「99%的CPU符合IEEE754」需要一個免責聲明 - 精神是真實的,對於這個問題你是正確的目的,但總的來說,魔鬼往往是在細節。更像是,99%的CPU符合99%的IEEE754標準。 – moonshadow 2014-02-17 17:01:26

+0

[標準委員會關心的異域架構](http://stackoverflow.com/q/6971886/995714) – 2016-06-13 10:57:07

4

Cell處理器的SPU的differ in a few ways(比如缺少INF和NaN的),但我不認爲有差異會打破你的假設......

+3

好點。 ARM-Neon SIMD單元(用於較新的iPhone和其他移動設備)在幾個方面也有所不同。儘管如此,CPU能夠在VPF模式下執行一致的浮點運算。 哦,而MIPS R5900(PlayStation 2)也有一些問題。最明顯的是乘法的最後一個尾數位是未定義的。 – 2010-02-10 05:28:20

+3

我目前在我的辦公桌上有三個獨立的嵌入式硬件,這三個不同的PowerPC派生的CPU以不同的方式不兼容... – moonshadow 2014-02-17 16:55:43

10

這取決於你在哪裏畫之間的「真實的線世界「和想象的世界。

  1. Vax G格式在Alpha機器上仍然受支持(惠普表示他們將至少支持2013年支持)。
  2. IBM十六進制FP仍受IBM z系列主機支持。他們已經增加了IEEE二進制和十進制支持,但從我聽說他們很少使用,因爲十六進制FP更快一些(IBM已經優化它大約45年了...)

直到最近,Unisys仍然銷售支持Burroughs FP格式的ClearPath IX服務器和支持Univac FP格式的ClearPath MCP機器。我相信現在只能仿真(至強),但從軟件角度來看,他們可能會繼續使用十年或更長時間。

甚至還有一個few people使用DtCyber在具有獨特浮點格式的(模擬)Control Data主機上運行Plato。 (對不起,我的第一個嚴肅的節目是在CDC Cyber​​機器上,所以我忍不住提起它,即使它幾十年來一直不是「真實世界」)。

2

PowerPC處理器(Macs直到2006-2007,大量當前的IBM服務器)使用128位格式,包含兩個雙精度長雙精度格式,而不是IEEE 754擴展格式。但是,在C或Objective-C中,沒有可移植的方式將32位或64位浮點數解釋爲整數(假設float和uint32_t,或double和uint64_t具有相同的位數)。當我需要做這樣的事情時,我必須根據編譯器編寫不同的代碼(一個使用聯合,一個是通過將double *轉換爲long long *)。不知道C++中的reinterpretcast是否可以移植。

+0

它是[double-double arithmetic](http://en.wikipedia.org/wiki/Quadruple-precision_floating-point_format#Double-double_arithmetic) – 2015-01-29 19:21:57

+2

20世紀80年代,Macintosh「標準Apple數字環境」使用32位,64位和80位浮點類型,其中80位類型是最快的,因爲指數並且尾數可以很容易地加載到寄存器中,無需掩碼,而我不知道SANE是否利用了這一事實,延遲歸一化可以避免有時可能是重複浮點加法中最慢的部分之一。 – supercat 2015-05-14 19:23:00