Actualmente estoy trabajando en un proyecto de C++ que realiza cálculos numéricos. La gran mayoría del código usa valores de punto flotante de precisión simple y funciona perfectamente bien con eso. Debido a esto, utilizo indicadores de compilación para hacer que los literales de coma flotante básicos tengan una precisión única en lugar de la precisión doble, que es la predeterminada. Encuentro que esto hace que las expresiones sean más fáciles de leer y no tengo que preocuparme de olvidar una 'f' en alguna parte. Sin embargo, de vez en cuando necesito la precisión adicional que ofrecen los cálculos de precisión doble y mi pregunta es cómo puedo obtener un literal de precisión doble en esa expresión. De todas las maneras que he intentado hasta ahora, primero almaceno el valor en una sola variable de precisión y convierte el valor truncado a un valor de precisión doble. No es lo que quiero¿Hay un sufijo literal en punto flotante en C++ para hacer un número doble de precisión?
Algunas formas que he probado hasta ahora se dan a continuación.
#include <iostream>
int main()
{
std::cout << sizeof(1.0E200) << std::endl;
std::cout << 1.0E200 << std::endl;
std::cout << sizeof(1.0E200L) << std::endl;
std::cout << 1.0E200L << std::endl;
std::cout << sizeof(double(1.0E200)) << std::endl;
std::cout << double(1.0E200) << std::endl;
std::cout << sizeof(static_cast<double>(1.0E200)) << std::endl;
std::cout << static_cast<double>(1.0E200) << std::endl;
return 0;
}
Una ejecución con constantes de precisión únicas arroja los siguientes resultados.
~/path$ g++ test.cpp -fsingle-precision-constant && ./a.out
test.cpp:6:3: warning: floating constant exceeds range of ‘float’ [-Woverflow]
test.cpp:7:3: warning: floating constant exceeds range of ‘float’ [-Woverflow]
test.cpp:12:3: warning: floating constant exceeds range of ‘float’ [-Woverflow]
test.cpp:13:3: warning: floating constant exceeds range of ‘float’ [-Woverflow]
test.cpp:15:3: warning: floating constant exceeds range of ‘float’ [-Woverflow]
test.cpp:16:3: warning: floating constant exceeds range of ‘float’ [-Woverflow]
4
inf
16
1e+200
8
inf
8
inf
Es mi entendimiento de que los 8 bytes proporcionados por los dos últimos casos, debería ser suficiente para mantener 1.0E200, una teoría apoyada por la siguiente salida, en el que el mismo programa se compila sin -fsingle precisión constante .
~/path$ g++ test.cpp && ./a.out
8
1e+200
16
1e+200
8
1e+200
8
1e+200
Una posible solución sugerida por los ejemplos anteriores es el uso de precisión cuádruple literales de punto en todas partes que originalmente la intención de utilizar doble precisión, y el reparto de doble precisión cuando así lo requiera tales bibliotecas y flotante. Sin embargo, esto se siente un poco derrochador.
¿Qué más puedo hacer?
no probado, pero 'strtod ("1e + 200") 'simplemente podría optimizarse para la constante de punto flotante de doble precisión que desee. –
No sé, esto suena un poco como si estuvieras creando un problema para ti. ¿Por qué no dejarlo tal como está y anexar 'f' a todo lo que no necesite doble precisión? – Mysticial
Puede poner sus constantes dobles en un archivo separado y compilar sin el indicador '-single-precision-constant'. –