2012-02-23 16 views
6

acuerdo con el siguiente sitio: http://en.cppreference.com/w/cpp/language/typesdobles - IEEE 754 alternativas

"doble - doble precisión en coma flotante de tipo general, IEEE-754 de 64 bits de tipo de punto flotante.".

Dice "normalmente". ¿Qué otros formatos/estándares posibles podría usar C++ double? ¿Qué compilador usa una alternativa al formato IEEE? O la arquitectura?

+0

Creo que todas las excepciones van a ser muy antiguas. Usé un Control Data Cyber ​​que tenía un punto flotante de 60 bits, por ejemplo. –

+0

Según el [repositorio de todo conocimiento] (http://en.wikipedia.org/wiki/Floating_point#History): algunos mainframes de IBM y Cray, y cualquier cosa anterior a principios de los 80, utilizan formatos que no son IEEE. –

+0

Cualquier cosa que cumpla con el estándar de C++ servirá. –

Respuesta

3

Para una breve lección de historia, puede consultar el Intel Floating Point Case Study.

Los compiladores de Intel tienen una opción que está activada de manera predeterminada cuando se optimiza y habilita el llamado fast-math feature. Esto hace que las matemáticas sean mucho más rápidas, pero deja de cumplir estrictamente con los estándares IEEE. Se puede aplicar el estricto cumplimiento del estándar con el fp-model option.

Creo que el lenguaje CUDA para NVidia GPU también tiene una biblioteca matemática significativamente más rápida si uno está dispuesto a renunciar al estricto cumplimiento del estándar IEEE. Esto no solo hace que las matemáticas sean más rápidas, sino que también reduce el número de registros utilizados para funciones trascendentales en particular.

Si el cumplimiento es necesario depende caso por caso. Hemos tenido problemas con las optimizaciones de Intel y tuvimos que activar la opción fp-model strict para garantizar resultados correctos con matemática de precisión doble.

6

Vaxen, Crays, e IBM mainframes, por nombrar solo algunos que todavía están en un uso razonablemente amplio. La mayoría (¿todos?) De ellos también pueden hacer IEEE punto flotante ahora, pero a veces solo con un complemento especial. En otros casos (IBM) aritmética IEEE puede llevar a una pena de velocidad significativa.

En cuanto a las máquinas más antiguas, la mayoría de los mainframes (Unisys, Control Data, etc.) utilizaban formatos de coma flotante únicos, la mayoría de los cuales ni siquiera se parecían mucho a IEEE, por no mencionar que realmente se ajustaban.

0

Probablemente valga la pena agregar, en respuesta a "¿Qué otros formatos/estándares posibles podría usar C++?", Ese gcc para Atmel AVR (que son CPU de datos de 8 bits, utilizados en algunos Arduinos) no implementa double como 64 bits.

Véase el GCC wiki, avr-gcc page y específicamente el 'double' subsection of 'Deviations from the Standard' donde dice

double es sólo 32 bits de ancho y aplicado de la misma manera como float

Creo otras CPUs tienen implementaciones similares, pero No pude encontrarlos.

Cuestiones relacionadas