2010-12-04 13 views

Respuesta

17

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.

+0

y que más o menos definitivamente responde a la pregunta de la OP, ¿verdad? –

0

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.

+0

Casi sí en una máquina de hoy, pero en un dispositivo incrustado que tiene una FPU no estoy tan seguro ... – jokoon

+0

@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

+0

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

5

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

1

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.

+0

+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

0

Porque double puede aproximarse 3.14 mucho mejor que float, tal vez? Estos son los valores exactos:

3.140000000000000124344978758017532527446746826171875 (double)

3,1400001049041748046875 (float)

+4

, ninguno de los cuales es una buena aproximación para PI :-D – franji1

Cuestiones relacionadas