Tipi a virgola mobile di dimensioni fisse

Nelle stdint.h (C99), boost / cstdint.hpp e cstdint (C ++ 0x) esiste, tra le altre cose, il tipo int32_t .

Esistono tipi di virgola mobile di dimensioni fisse simili? Qualcosa come float32_t ?

Al momento non esiste nulla di simile negli standard C o C ++. In realtà, non c’è nemmeno la garanzia che il float sia un formato binario a virgola mobile.

Alcuni compilatori garantiscono che il tipo float sarà il formato binario a 32 bit IEEE-754. Alcuni no. In realtà, float è in effetti il single tipo IEEE-754 sulla maggior parte delle piattaforms non incorporate, sebbene si applichino le solite avvertenze su alcuni compilatori che valutano le espressioni in un formato più ampio.

C’è un gruppo di lavoro che discute l’aggiunta di binding di linguaggio C per la revisione del 2008 di IEEE-754, che potrebbe prendere in considerazione l’idea di aggiungere un typedef di questo tipo. Se questo fosse aggiunto a C, mi aspetto che lo standard C ++ segua l’esempio … alla fine.

Se vuoi sapere se il tuo float è il tipo IEEE a 32 bit, controlla std::numeric_limits::is_iec559 . È una costante in fase di compilazione, non una funzione.

Se vuoi essere più a prova di proiettile, controlla anche std::numeric_limits::digits per assicurarti che non stiano subdolamente usando la precisione doppia dello standard IEEE per float . Dovrebbe essere 24.

Quando si tratta di long double , è più importante controllare i digits perché ci sono un paio di formati IEEE che potrebbe essere ragionevolmente: 128 bit (cifre = 113) o 80 bit (cifre = 64).

Non sarebbe pratico avere float32_t quanto tale, in genere si desidera utilizzare l’hardware a virgola mobile, se disponibile, e non ricorrere a un’implementazione software.

Se pensate che avere typedef come float32_t e float64_t siano poco pratici per qualsiasi motivo, dovete essere troppo abituati al vostro SO familiare, il compilatore, che non siete in grado di guardare oltre il vostro nido.

Esiste hardware che esegue in modo nativo operazioni in virgola mobile IEEE a 32 bit e altre che eseguono 64 bit. A volte tali sistemi devono anche comunicare tra loro, nel qual caso è estremamente importante sapere se un doppio è a 32 bit o 64 bit su ciascuna piattaforma. Se la piattaforma a 32 bit dovesse eseguire calcoli eccessivi sulla base dei valori a 64 bit dall’altro, potremmo voler eseguire il cast sulla precisione inferiore in base ai requisiti di temporizzazione e velocità.

Personalmente mi sento a disagio nell’usare float e double, a meno che non sappia esattamente quanti bit sono sul mio platfrom. Ancor di più se devo trasferirli su un’altra piattaforma su qualche canale di comunicazione.

Attualmente esiste una proposta per aggiungere i seguenti tipi nella lingua:

 decimal32 decimal64 decimal128 

che può un giorno essere accessibile attraverso #include .

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3871.html