que - ¿Por qué los tipos de coma flotante c/c++ son tan extrañamente nombrados?




que es coma flotante en informatica (8)

C ++ ofrece tres tipos de punto flotante: flotante, doble y doble larga. Poco uso el punto flotante en mi código, pero cuando lo hago, siempre me sorprenden las advertencias en líneas inocuas como

float PiForSquares = 4.0;

El problema es que el literal 4.0 es un doble, no un flotador, lo cual es irritante.

Para tipos enteros, tenemos short int, int y long int, lo cual es bastante sencillo. ¿Por qué C no solo tiene flotación corta, flotación y flotación larga? ¿Y de dónde vino el "doble"?

EDITAR: Parece que la relación entre tipos flotantes es similar a la de los enteros. el doble debe ser al menos tan grande como flotar, y el doble largo es al menos tan grande como el doble. No se realizan otras garantías de precisión / rango.


En primer lugar, estos nombres no son específicos de C ++, pero son una práctica bastante común para cualquier tipo de datos de coma flotante que implemente IEEE 754.

El nombre 'doble' se refiere a 'doble precisión', mientras que el flotador a menudo se dice que es 'precisión simple'.


Los dos formatos de coma flotante más comunes usan 32 bits y 64 bits, el más largo es "doble" el tamaño del primero, por lo que se denominó "doble".


Literales

El problema es que el literal 4.0 es un doble, no un flotador, lo cual es irritante.

Con constantes hay una diferencia importante entre enteros y flotantes. Si bien es relativamente fácil decidir qué tipo de entero usar (selecciona lo más pequeño posible para mantener el valor, con cierta complejidad añadida para firmar / no firmar), con flotadores no es tan fácil. Muchos valores (incluidos los simples como 0.1) no se pueden representar exactamente mediante números flotantes y, por lo tanto, la elección del tipo afecta no solo al rendimiento, sino también al valor del resultado. Parece que los diseñadores de lenguaje C preferían la solidez frente al rendimiento en este caso y, por lo tanto, decidieron que la representación predeterminada debería ser la más exacta.

Historia

¿Por qué C no solo tiene flotación corta, flotación y flotación larga? ¿Y de dónde vino el "doble"?

Los términos "precisión simple" y "precisión doble" se originaron en FORTRAN y ya se usaban ampliamente cuando se inventó C.


De acuerdo, históricamente aquí es la forma en que solía ser:

Las máquinas originales utilizadas para C tenían palabras de 16 bits divididas en 2 bytes, y una char era de un byte. Las direcciones eran 16 bits, por lo que sizeof(foo*) era 2, sizeof(char) era 1. Un int era de 16 bits, por lo que sizeof(int) también era 2. Luego aparecían las máquinas VAX (direccionamiento extendido) y una dirección fue de 32 bits. Un char todavía era de 1 byte, pero sizeof(foo*) ahora era 4.

Hubo cierta confusión, que se estableció en los compiladores de Berkeley, por lo que un corto ahora tiene 2 bytes y un int es de 4 bytes, ya que son adecuados para el código eficiente. A long se convirtió en 8 bytes, porque había un método de direccionamiento eficiente para bloques de 8 bytes --- que se llamaban palabras dobles . Los bloques de 4 bytes eran palabras y seguro enugh, los bloques de 2 bytes eran halfwords .

La implementación de los números de coma flotante era tal que cabían en palabras sueltas o palabras dobles. Para mantenerse consistente, el número de punto flotante de doble palabra se denominó "doble".


Los términos "precisión simple" y "precisión doble" se originaron en FORTRAN y ya se usaban ampliamente cuando se inventó C. A principios de los años setenta, las máquinas de precisión única eran significativamente más eficientes y, como hoy, usaban la mitad de memoria que la precisión doble. Por lo tanto, era un valor razonable por defecto para los números de coma flotante.

long double se agregó mucho más tarde cuando el estándar IEEE hizo concesiones para el chip de coma flotante Intel 80287, que usaba números de coma flotante de 80 bits en lugar de la clásica doble precisión de 64 bits.

El que pregunta es incorrecto sobre las garantías; hoy en día, casi todos los idiomas garantizan implementar números de coma flotante binarios IEEE 754 con precisión simple (32 bits) y precisión doble (64 bits). Algunos también ofrecen una precisión extendida (80 bits), que se muestra en C como el long double . El estándar de coma flotante IEEE, encabezado por William Kahan, fue un triunfo de la ingeniería sobre la conveniencia: en las máquinas del día, parecía prohibitivamente caro, pero en las máquinas de hoy es muy barato, y la portabilidad y predictibilidad de IEEE flotando Los números de puntos deben ahorrar tropecientos millones de dólares cada año.


Probablemente sabías esto, pero puedes hacer flotadores literales / dobles largos

 float f = 4.0f;
 long double f = 4.0l;

El doble es el valor predeterminado porque eso es lo que la mayoría de la gente usa. Los dobles largos pueden ser exagerados o los flotantes tienen muy mala precisión. Doble funciona para casi todas las aplicaciones.

¿Por qué nombrar? Un día todo lo que teníamos eran números de punto flotante de 32 bits (bueno, realmente todo lo que teníamos eran números de punto fijo, pero me estoy desviando). De todos modos, cuando el punto flotante se convirtió en una característica popular en las arquitecturas modernas, C era probablemente el lenguaje dujour entonces, y el nombre "flotante" se le dio. Parecía tener sentido.

En ese momento, se podía haber pensado en el doble, pero realmente no se había implementado en la CPU / fp cpus del tiempo, que eran 16 o 32 bits. Una vez que el doble se usó en más arquitecturas, C probablemente llegó a agregarlo. C necesitaba algo así como un nombre para algo dos veces más grande que un flotador, por lo tanto, obtuvimos un doble. Entonces alguien necesitaba aún más precisión, pensamos que estaba loco. Lo agregamos de todos modos. El nombre quadtuple (?) Fue excesivo. Long double fue lo suficientemente bueno, y nadie hizo mucho ruido.

Parte de la confusión es que good-ole "int" parece cambiar con el tiempo. Solía ​​ser que "int" significaba un entero de 16 bits. Sin embargo, Float está vinculado al IEEE std como el número de coma flotante IEEE de 32 bits. Por esa razón, C mantuvo flotante definido como de 32 bits e hizo doble y doble largo para referirse a los estándares más largos.


Un doble se llama así porque es el doble de la "precisión" de un flotante. Realmente, lo que esto significa es que usa el doble del espacio de un valor de coma flotante; si tu flotador es de 32 bits, entonces tu doble será de 64 bits.

El nombre doble precisión es un poco inapropiado, ya que un flotador de precisión doble tiene una precisión de la mantisa de 52 bits, donde un flotador de precisión simple tiene una precisión de mantisa de 23 bits (el doble de 56). Más sobre el punto flotante aquí: Punto flotante - Wikipedia , incluyendo enlaces en la parte inferior a artículos sobre flotadores de precisión simple y doble.

El nombre doble largo es probable que tenga la misma tradición que el entero largo frente al entero corto para los tipos integrales, excepto que en este caso lo invirtieron, ya que 'int' es equivalente a 'long int'.


Se llaman precisión simple y precisión doble porque están relacionados con el tamaño natural (no está seguro del término) del procesador. Entonces, la precisión simple de un procesador de 32 bits sería de 32 bits de largo, y su doble precisión sería el doble de eso: 64 bits de largo. Simplemente decidieron llamar al tipo de precisión simple "flotante" en C.





ieee-754