¿Por qué tengo que poner 3.14f en lugar de 3.14 para desactivar todas esas advertencias? ¿Hay una razón de razón coherente para esto?¿Por qué el valor de coma flotante como 3.14 se considera como el doble de forma predeterminada en MSVC?
Respuesta
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 flotando literal es el doble a menos explícitamente especificado por un sufijo. Los sufijos f y F de 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 programa está mal formado.
Esto es probablemente un estándar en el mundo C. Se prefiere doble porque es más preciso y probablemente no verá ninguna diferencia de rendimiento. Lee this post.
Casi sí en una máquina de hoy, pero en un dispositivo incrustado que tiene una FPU no estoy tan seguro ... – jokoon
@gokoon: eso es cierto; de manera predeterminada, asumí que estamos hablando de máquinas "normales". Con eso quiero decir computadoras de escritorio y servidores.En un dispositivo integrado, la optimización es importante y tener que elegir entre short e int en algunos casos no es infrecuente. – darioo
Incluso con una FPU, una doble requiere el doble del espacio de una flotación, de modo que cuando se procesan * cantidades de datos * muy grandes, el ancho de banda de la memoria puede volverse significativo incluso cuando las operaciones individuales de nivel de registro tardan el mismo tiempo. – Clifford
C y C++ prefieren doble flotar 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).
Es probablemente mejor pensar en float
como una contraído double
, en lugar de ser un prolongado double
float
. Es decir, double
es el tipo de punto flotante preferido, y float
se usa siempre que se requiere una versión más pequeña de 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 exclusivo de MSVC, es requerido por el estándar de idioma.
Sugeriría que tiene sentido no para 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 un flotador de precisión simple rara vez son suficientes para un uso general y ciertamente en un moderno procesador de escritorio se usaría como una optimización manual donde el escritor haya determinado que es suficiente y necesario; por lo tanto, tiene sentido que se requiera un marcador visible explícito para especificar un literal de precisión simple.
+1; @gokoon: hay otros sufijos que deberías usar si quieres obtener el tipo o tamaño adecuado. Por ejemplo, si desea un valor sin signo de 64 bits, use el sufijo 'ull' – franji1
Porque double
puede aproximarse 3.14 mucho mejor que float
, tal vez? Estos son los valores exactos:
3.140000000000000124344978758017532527446746826171875 (double
)
3,1400001049041748046875 (float
)
, ninguno de los cuales es una buena aproximación para PI :-D – franji1
- 1. Mostrar el número de coma flotante como un porcentaje sin cambiar el valor del número
- 2. Representa el valor doble como NSString
- 3. ¿Por qué MSVC++ considera que "std :: strcat" es "inseguro"? (C++)
- 4. Aritmética de coma flotante - Operador de módulo en el tipo doble
- 5. Extraer flotante/valor doble
- 6. de coma flotante Limitaciones
- 7. ¿Por qué veo una variable doble inicializada a algún valor como 21.4 como 21.399999618530273?
- 8. ¿Utiliza el valor negativo de coma flotante cero?
- 9. ¿Por qué el ORM se considera bueno pero el "seleccionar *" se considera malo?
- 10. Establecer @ Html.RadioButtonFor como comprobado de forma predeterminada
- 11. ¿Por qué Java's Double.compare (doble, doble) está implementado como está?
- 12. valor dpi de forma predeterminada "grande", el texto "pequeña", "medio" y considera androide
- 13. ¿Qué respuestas considera jQuery.ajax como "exitosas"?
- 14. ¿Por qué el área de volver como 0?
- 15. Soporte de coma flotante en el compilador de 64 bits
- 16. ¿Por qué se 'implementa' como 'como'?
- 17. Coseno en coma flotante
- 18. (¿por qué) se considera dañino el selector de estrella CSS?
- 19. Valor predeterminado de MySQL como el valor de otro campo
- 20. ¿Cómo se obtiene el siguiente valor en la secuencia de coma flotante?
- 21. ¿El operador de dólares ($) se considera de mala forma? ¿Por qué?
- 22. define constante doble como hexadecimal?
- 23. ¿Por qué el sprintf de Perl no redondea correctamente los números de coma flotante?
- 24. Comparación de coma flotante 0
- 25. Corrección de números en coma flotante
- 26. Reproducción de una forma de onda (matriz flotante) como sonido
- 27. ¿Por qué el readf no se comporta como se esperaba?
- 28. ¿Qué es E en coma flotante?
- 29. ¿Qué tipos de números son representables en coma flotante binario?
- 30. C++ marque el valor enum como obsoleto?
y que más o menos definitivamente responde a la pregunta de la OP, ¿verdad? –