¿Por qué el valor de coma flotante como 3.14 se considera como el doble de forma predeterminada en MSVC?

¿Por qué tengo que poner 3.14f en lugar de 3.14 para desactivar todas esas advertencias? ¿Hay alguna razón de razón coherente para esto?

Eso es lo que decidieron los estándares C ++ (y C). Los literales de punto flotante son del tipo double, y si necesita que sean flotantes, los sufijo con un f . No parece haber ninguna razón específicamente declarada sobre por qué, pero supongo que es a) Por compatibilidad con C, yb) Una compensación entre precisión y almacenamiento.

2.13.3 Literales flotantes El tipo de un literal flotante es doble a menos que se especifique explícitamente por un sufijo. Los sufijos f y F especifican float, los sufijos l y L especifican long double. Si el valor escalado no está en el rango de valores representables para su tipo, el progtwig está mal formado.

C y C ++ prefieren flotar dos veces en un par de formas. Como habrás notado, los literales fraccionarios son dobles a menos que se hagan flotantes explícitamente. Además, las flotantes no se pueden pasar en varargs, siempre se promueven al doble (de la misma manera que char y short se promueven a int in varargs).

Probablemente sea mejor pensar en float como un double contraído, en lugar de double como un float extendido. Es decir, el double es el tipo de punto flotante preferido, y el float se usa siempre que se requiere una versión más pequeña del double para un caso particular. Eso es lo más cercano que conozco a una razón coherente, y luego la regla tiene sentido, incluso si estás en el caso de que necesites una versión más pequeña.

Esto no es peculiar de MSVC, es requerido por el estándar de lenguaje.

Sugeriría que tiene sentido no reducir la precisión a menos que se solicite explícitamente, por lo que el valor predeterminado es doble.

Los 6 dígitos significativos de precisión que proporciona una flotación de precisión simple rara vez son suficientes para un uso general y, ciertamente, en un procesador de escritorio moderno se usarían como una optimización codificada a mano, donde el escritor haya determinado que es suficiente y necesaria; por lo tanto, tiene sentido que se requiera un marcador visible explícito para especificar un literal de precisión simple.

Este es probablemente un estándar en C mundo. Se prefiere doble porque es más preciso y probablemente no verá ninguna diferencia de rendimiento. Lea esta publicación .

Porque el double puede aproximarse a 3.14 mucho mejor que float , tal vez? Aquí están los valores exactos:

3.140000000000000124344978758017532527446746826171875 ( double )

3.1400001049041748046875 ( float )