que punto numero notación normalizada mantisa informatica flotante exponente ejemplos coma c++ c floating-point history ieee-754

c++ - numero - punto flotante plc



¿Por qué los tipos de coma flotante c/c++ son tan extrañamente nombrados? (12)

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

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.


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


double es la abreviatura de "doble precisión". El doble largo, supongo, proviene de no querer agregar otra palabra clave cuando un tipo de coma flotante con una precisión aún mayor comenzó a aparecer en los procesadores.


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


En la representación de punto fijo, hay un número fijo de dígitos después del punto de base (una generalización del punto decimal en representaciones decimales). Contraste a esto con las representaciones de coma flotante donde el punto de base se puede mover, o flotar, dentro de los dígitos del número que se está representando. Por lo tanto, el nombre de "representación en coma flotante". Esto fue abreviado como "flotar".

En K & R C, float hace referencia a representaciones de coma flotante con representaciones binarias de 32 bits y representaciones de coma flotante double con representaciones binarias de 64 bits, o el doble del tamaño y de dónde proviene el nombre. Sin embargo, la especificación original de K & R requería que todos los cálculos de coma flotante se hicieran con doble precisión.

En el estándar IEEE 754 inicial (IEEE 754-1985), el estándar de oro para representaciones de coma flotante y aritmética, se proporcionaron definiciones para representaciones binarias de números de punto flotante de precisión simple y precisión simple. Los números de precisión doble eran acertadamente nombre ya que se representaban con el doble de bits que los números de precisión simple.

Para obtener información detallada sobre las representaciones de coma flotante, lea el artículo de David Goldberg, Lo que todo científico informático debe saber sobre la aritmética de coma flotante .


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.


Se debe tener en cuenta que el double NO tiene que poder contener valores de mayor magnitud que los de float ; solo tiene que ser más preciso .


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.


de ahí el% f para un tipo de flotación, y un% lf para un flotación larga que es lo mismo que doble.