Sto cercando un'implementazione di riferimento delle operazioni IEEE-754. C'è una cosa del genere?Esiste un'implementazione c/C++ open source delle operazioni IEEE-754?
risposta
Credo che le librerie C SoftFloat esiano adatte a ciò che state cercando. Altri includono Linux (GNU libc, glibc) o * BSD libc math functions. Infine, CRlibm dovrebbe interessarti anche a te.
Ulrich Drepper ha un'interessante look at different math libraries, che potrebbe valere anche la pena di leggere.
SoftFloat è di John R. Hauser che ha scritto un articolo sull'uso delle eccezioni IEEE nell'articolo TOPLAS. Non ero a conoscenza del fatto che Hauser abbia scritto una propria implementazione, quindi è probabile che in effetti abbia scritto un'implementazione di riferimento. –
Grazie. SoftFloat è sicuramente quello che stavo cercando. Darò un'occhiata anche agli altri. –
Una domanda piuttosto confusa; in C++ si presume che questo tipo di dettaglio sia curato dall'hardware o dal compilatore. Quindi, in C++ l'aggiunta in virgola mobile sarebbe
float a = 1.0;
float b = 2.0;
float c = a + b;
Sono sicuro che questo non è ciò che intendevi in realtà; forse potresti beneficiare di this page che tenta di emulare l'hardware conforme allo standard IEEE-754 in javascript?
E no, guardare all'origine del compilatore non sarebbe utile, dato che stareste guardando il codice C per generare il codice assembly conforme allo standard IEEE-754, piuttosto che il codice C che esegue i calcoli IEEE-754. –
I vecchi chip ARM (e probabilmente alcuni nuovi) non hanno una FPU, quindi guardare il codice sorgente di un compilatore che punta a ARM potrebbe essere utile, dato che deve essere capace di eseguire float e doppia aritmetica "nel software" . Naturalmente le implementazioni saranno ottimamente ottimizzate e potrebbero utilizzare ops di CPU che non sono del tutto banali in C. –
Devo deludervi: praticamente non ce n'è.
Mentre tecnicamente ci sono IEEE 754-sistemi conformi perché fanno non implementare funzioni non richiesti descritti nella norma, un'implementazione di riferimento consente
- accesso a tutte le modalità di arrotondamento
- supporto segnalazione NaN
- supporto intrappolamento di cinque trappole
non esiste nel supporto lingue ard Ciò causa le guai ricorrenti di William Kahan, la forza principale dietro lo standard e il suo adattamento sui processori Intel.
Non so se ci sono alcune lingue esoteriche che Do sostenerli, ma posso escludere Java, C#, C++, Fortran.
MODIFICA: Sebbene manchi il supporto del compilatore, consiglio l'implementazione di Hausers SoftFloat fornita da mctylr. Hauser sa cosa sta facendo.
"alcuni linguaggi esoterici che li supportano". Penso che il caso sia più che tutte le lingue supportino queste, ma che le differenze sottostanti nell'hardware o la conformità hardware incompleta sono più il problema. Soprattutto se si considera che le lingue sono generalmente definite in modi indipendenti dall'architettura e quindi compilate da programmi che funzionano su molte architetture. Un linguaggio di programmazione che offra calcoli matematici a virgola mobile su hardware non può garantire garanzie IEEE754. – Richard
un lavoro in giro per voi potrebbe Python. Python ha una funzione che può convertire IEEE-754 32/64 bit punto di precisione HEX float
import struct
struct.unpack('!f', '41973333'.decode('hex'))[0]
è possibile si scrive applicazione in Python o semplicemente creare una funzione di pitone e chiamarlo in C/C++
Non sono sicuro di come chiamare python da C/C++ ma è possibile. Calling Python functions from C++
Sembra molto lavoro passare da C++ a Python per questo. –
Si intende "implementazione di riferimento" nel senso di "qualcosa che posso copiare ed essere sicuro che sia giusto" o nel senso di "qualcosa fornito dall'IEEE come una descrizione non normativa dell'IEEE- 754 standard sotto forma di codice C++ "? Per il primo, si sta cercando "l'emulazione floating point del software", ad esempio, ecco un elenco delle funzioni di GCC: http://gcc.gnu.org/onlinedocs/gccint/Soft-float-library-routines.html –
Dovrei aggiungere che essendo GCC, mi aspetto che ci sia una pura implementazione C di quelle funzioni che i writer back-end possono sostituire con il codice specifico della piattaforma. Ma non ho effettivamente controllato. –
https://github.com/bobbl/float754 è un altro progetto. – masterxilo