2010-02-02 19 views
14

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?

+2

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 –

+0

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

+0

https://github.com/bobbl/float754 è un altro progetto. – masterxilo

risposta

8

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.

+1

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

+0

Grazie. SoftFloat è sicuramente quello che stavo cercando. Darò un'occhiata anche agli altri. –

1

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?

+0

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

+1

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

3

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.

http://portal.acm.org/citation.cfm?id=227699.227701&coll=portal&dl=ACM&CFID=77938829&CFTOKEN=18578907

+0

"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

-1

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++

+2

Sembra molto lavoro passare da C++ a Python per questo. –