2012-02-23 8 views
6

secondo il seguente sito: http://en.cppreference.com/w/cpp/language/typesDoppia - IEEE 754 alternative

"double - doppia precisione di tipo virgola mobile IEEE-754 Di solito tipo in virgola mobile a 64 bit.".

Dice "di solito". Quali altri possibili formati/standard potrebbe utilizzare C++ double? Quale compilatore utilizza un'alternativa al formato IEEE? O architettura?

+0

Penso che tutte le eccezioni saranno molto vecchie. Ad esempio, ho usato un Data Cyber ​​di controllo con un punto mobile a 60 bit. –

+0

Secondo il [repository of all knowledge] (http://en.wikipedia.org/wiki/Floating_point#History): alcuni mainframe IBM e Cray, e qualsiasi cosa risalente ai primi anni '80, utilizzano formati non IEEE. –

+0

Qualunque cosa sia conforme allo standard C++. –

risposta

3

Per una breve lezione di storia, è possibile controllare il Intel Floating Point Case Study.

I compilatori Intel dispongono di un'opzione attivata per impostazione predefinita durante l'ottimizzazione che abilita un cosiddetto fast-math feature. Questo rende la matematica molto più veloce, ma riduce la stretta conformità con gli standard IEEE. Si può applicare la stretta conformità allo standard fp-model option.

Credo che il linguaggio CUDA per le GPU NVidia abbia anche una libreria matematica significativamente più veloce se si è disposti a rinunciare alla stretta conformità con lo standard IEEE. Ciò non solo rende la matematica più veloce, ma riduce il numero di registri utilizzati in particolare per le funzioni trascendentali.

Se la conformità è necessaria dipende caso per caso. Abbiamo riscontrato problemi con le ottimizzazioni Intel e abbiamo dovuto attivare l'opzione fp-model strict per garantire risultati corretti con matematica a precisione doppia.

6

mainframe Vaxen, Crays e IBM, per citarne solo alcuni che sono ancora in uso abbastanza ampio. La maggior parte (tutti?) Di quelli possono anche fare il virgola mobile IEEE ora, ma a volte solo con un add-on speciale. In altri casi (IBM) l'aritmetica IEEE può comportare una significativa riduzione della velocità.

Come per le macchine più vecchie, la maggior parte dei mainframe (Unisys, Control Data, ecc.) Utilizzava formati in virgola mobile univoci, la maggior parte dei quali non erano nemmeno come IEEE, per non dire realmente conformi.

0

Probabilmente vale la pena di aggiungere, in risposta a "Quali altri possibili formati/standard potrebbe C++ doppio uso?", Che gcc per Atmel AVR (che sono CPU di dati a 8 bit, utilizzati in alcuni Arduino) non implementa double come 64 bit.

Vedere la GCC wiki, avr-gcc page e specificatamente la 'double' subsection of 'Deviations from the Standard' dove si dice

double è largo solo 32 bit e attuate nello stesso modo come float

Credo altre CPU hanno implementazioni simili, ma Non sono riuscito a trovarli