Le CPU del mondo reale non utilizzano IEEE 754?

Sto ottimizzando una funzione di ordinamento per una libreria numerica / statistica basata sul presupposto che, dopo aver filtrato tutti i NaN e fatto un po ‘di movimento, i float possono essere confrontati come a 32 bit senza cambiare il risultato e i doppi possono essere confrontati come 64 bit inte

Questo sembra accelerare l’ordinamento di questi array da qualche parte dell’ordine del 40% e la mia ipotesi vale finché la rappresentazione a livello di bit dei numeri in virgola mobile è IEEE 754. Ci sono CPU reali che le persone effettivamente usano (escluso nei dispositivi incorporati, che questa libreria non ha come target) che usano qualche altra rappresentazione che potrebbe rompere questa ipotesi?

A parte i Pentium imperfetti , qualsiasi CPU basata su x86 o x64 utilizza IEEE 754 come standard aritmetico a virgola mobile.

Ecco una breve panoramica degli standard FPA e delle loro adozioni.

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. 

A meno che non pianifichi di supportare la tua libreria su architetture di CPU abbastanza esotiche, è lecito ritenere che per ora il 99% delle CPU sia conforms allo standard IEEE 754.

Dipende da dove si traccia la linea tra il “mondo reale” e quello immaginario.

  1. Il formato Vax G è ancora supportato su macchine Alpha (che HP sostiene che supporterà almeno per il 2013).
  2. FP esadecimale IBM ancora supportato dai mainframe IBM z-series. Hanno aggiunto il supporto binario e decimale IEEE, ma da quello che ho sentito sono usati raramente, perché il FP esadecimale è un po ‘più veloce (IBM lo sta ottimizzando da circa 45 anni …)

Fino a poco tempo fa, Unisys vendeva ancora i servizi ClearPath IX che supportavano il formato Burroughs FP e le macchine ClearPath MCP per supportare il formato Univac FP. Credo che ora vengano eseguite solo in emulazione (su Xeons) ma dal punto di vista del software, probabilmente continueranno ad essere utilizzate per un altro decennio o più.

Ci sono anche alcune persone che usano DtCyber per eseguire Plato su (emulato) i mainframe di Control Data, con il loro formato in virgola mobile unico. (Scusate, ma la mia prima seria programmazione era su una macchina Cyber ​​Cyber, quindi non ho potuto resistere alla sua presentazione, anche se per decenni non è stato un “mondo reale”).

Le SPU di Cell Processor differiscono in alcuni modi (come la mancanza di INF e NAN), ma non credo che ci siano differenze che potrebbero infrangere le tue ipotesi …

I processori PowerPC (Mac fino al 2006-2007, tonnellate di server IBM correnti) utilizzano un formato a 128 bit composto da due doppi per il doppio lungo, invece se il formato esteso IEEE 754.

Tuttavia, in C o Objective-C, non esiste un modo portatile per interpretare un numero in virgola mobile a 32 o 64 bit come numero intero (supponendo float e uint32_t, oppure double e uint64_t hanno lo stesso numero di bit). Quando avevo bisogno di fare questo genere di cose, dovevo scrivere un codice diverso a seconda del compilatore (uno stava usando un sindacato, uno era lanciando double * a long long *). Non ho idea se un reinterpretcast in C ++ lo farà in modo portabile.