simple resueltos representar que punto precisión para numero numericos metodos informatica flotante estandar ejercicios doble coma aritmetica c++ c++11 floating-point standards ieee-754

c++ - representar - punto flotante ejercicios resueltos



¿El estándar de C++ especifica algo en la representación de los números de coma flotante? (4)

Para los tipos T para los que std::is_floating_point<T>::value es true , ¿el estándar de C ++ especifica algo sobre la forma en que debería implementarse T ?

Por ejemplo, ¿ T tiene incluso que seguir una representación de signo / mantisa / exponente? ¿O puede ser completamente arbitrario?


De N3337:

[basic.fundamental/8]: hay tres tipos de punto flotante: float, double y long double. El tipo double proporciona al menos tanta precisión como float, y el tipo double double proporciona al menos tanta precisión como el doble. El conjunto de valores del tipo float es un subconjunto del conjunto de valores del tipo double; el conjunto de valores del tipo double es un subconjunto del conjunto de valores del tipo double double. La representación del valor de los tipos de coma flotante está definida por la implementación . Los tipos integrales y flotantes se denominan colectivamente tipos aritméticos. Las especializaciones de la plantilla estándar std :: numeric_limits (18.3) especificarán los valores máximos y mínimos de cada tipo aritmético para una implementación.

Si desea verificar si su implementación usa IEEE-754, puede usar std::numeric_limits::is_iec559 :

static_assert(std::numeric_limits<double>::is_iec559, "This code requires IEEE-754 doubles");

Hay varios otros rasgos de ayuda en esta área, como has_infinity , quiet_NaN y more .


El estándar C tiene un "anexo" (en C11 es el Anexo F) que establece lo que significa para una implementación de C cumplir con IEC 60559, el estándar sucesor de IEEE 754. Una implementación que cumple con el Anexo F debe tener IEEE -representación de números de coma flotante. Sin embargo, la implementación de este anexo es opcional; el estándar central específicamente evita decir algo sobre la representación de los números de coma flotante.

No sé si hay un anexo equivalente para C ++. No aparece en N3337, pero eso podría significar que se distribuye por separado. La existencia de std::numeric_limits<floating-type>::is_iec559 indica que el comité de C ++ al menos pensó en esto, pero quizás no con tanto detalle como lo hizo el comité C. (Es y siempre ha sido una pena que el estándar C ++ no se exprese como un conjunto de ediciones al estándar C).


La idea de std::is_floating_point es hacer que el código de usuario de origen diferente funcione mejor. Técnicamente, puede especificar un int como std::is_floating_point sin causar un comportamiento indefinido. Pero supongamos que tiene una biblioteca con plantillas que debe dividirse repetidamente por T n . Para acelerar las cosas, la biblioteca crea un T ni = 1 / n y reemplaza la división por n multiplicando por ni . Esto funciona muy bien para números en coma flotante, pero falla para enteros. Por lo tanto, la biblioteca solo hace la optimización de manera correcta si std::is_floating_point<T>::value == true . Si miente, el código probablemente todavía funciona desde el punto de vista del estándar, pero es incorrecto desde un punto de vista lógico. Por lo tanto, si escribe una clase que se comporta como un float más grande, std::is_floating_point como std::is_floating_point ; de lo contrario, no. Esto debería obtener tanto el código óptimo como el correcto.


No se requiere una implementación particular. El estándar de C ++ no habla mucho sobre eso. El estándar C entra bastante en detalles sobre el modelo conceptual asumido para los números de punto flotante, con un signo, exponente, significado en alguna base b , y así sucesivamente. Sin embargo, especifica específicamente que esto es puramente descriptivo, no un requisito sobre la implementación (C11, nota al pie 21):

El modelo de punto flotante está destinado a aclarar la descripción de cada característica de coma flotante y no requiere que la aritmética de coma flotante de la implementación sea idéntica.

Dicho esto, aunque los detalles pueden variar, al menos de golpe me parece que sería difícil producir (por ejemplo) una implementación conforme del double que no se ajustara bastante al modelo habitual (es decir, significativo y exponente) ( o al menos difícil de hacer con el rendimiento competitivo, de todos modos). Sin embargo, no sería particularmente difícil hacer que varíe de otras formas, como reorganizar el orden o utilizar una base diferente.

La definición de std::numeric_limits<T>::digits (y std::numeric_limits<T>::digits10 ) implican bastante directamente que lo que se enumera como un tipo de coma flotante debe retener (al menos aproximadamente) la misma precisión para todos los números en un rango bastante amplio de magnitudes. Con mucho, la forma más obvia de lograr eso es tener un número de bits / dígitos dedicados a un conjunto significativo, y otro conjunto (separado) de bits dedicados a un exponente.