¿Cuál es el significado de 0.0f al inicializar (en C)?

5 minutos de lectura

He visto código donde la gente inicializa variables flotantes como esta:

float num = 0.0f;

¿Hay una diferencia significativa entre esto y simplemente hacer lo siguiente a continuación?

float num = 0; 

Gracias.. 🙂

  • Muchos duplicados, por ejemplo, “f” después de número/flotante en Objective-C/C

    – Pablo R.

    4 de marzo de 2011 a las 21:24


  • Probablemente dejaron la f una vez. Una vez mordido dos veces tímido.

    -Hans Passant

    4 de marzo de 2011 a las 21:25

avatar de usuario
EvilTeach

flotante x = 0 tiene un encasillado implícito de int a float.
flotante x = 0.0f no tiene tal encasillamiento.
flotante x = 0.0 tiene un encasillado implícito de doble a flotante.

Dependiendo del compilador, el encasillado implícito puede requerir que el compilador genere código adicional.

  • Si tiene un compilador que hace el encasillado en tiempo de ejecución, tiene mayores problemas de rendimiento que un encasillado adicional. La única excepción es cuando el esquema de punto flotante exacto se puede seleccionar en tiempo de ejecución, en cuyo caso el compilador no necesariamente puede saber cuál es el tipo correcto (aunque es obvio en este caso).

    –David Thornley

    4 de marzo de 2011 a las 21:37


  • Sí, la última vez que vi el problema fue en un compilador Vax C.

    – EvilTeach

    4 de marzo de 2011 a las 21:42

  • es decir, hinchar el ejecutable (ligeramente)? Esto no es algo que un competidor del concurso de ejecutables de 4k consideraría aceptable, ¿verdad?

    – bobobobo

    28 de septiembre de 2012 a las 9:50

  • Creo que promoción es el término correcto. no encasillado. Todos los compiladores tendrían que hacerlo, no solo vax c

    – EvilTeach

    26 de enero de 2020 a las 15:17


avatar de usuario
steve jesop

Probablemente la razón es que una vez escribieron algo como:

float f = 1 / i; // i an integer

Habiendo depurado eso, juraron siempre decorar los literales lo suficiente como para obtener el tipo correcto:

float f = 1.0f / i;

En este caso, el .0 es asegurar que la división sea de coma flotante, no de enteros. los f es porque no hay necesidad de que la operación se haga en double — Espero que haya más posibilidades de una implementación donde 1.0/i sería significativamente más lento sin ningún beneficio (emulación flotante de software, optimización indiferente), que uno donde 1.0f es significativamente más lento sin ningún beneficio (si el doble es más rápido que el flotador, es porque tiene hardware fp, por lo que la conversión entre los dos será muy rápida, así que no introduzca significativo desacelerar).

Uno que tenga el hábito de decorar literales, bien podría escribir:

float f = 0.0f;

a pesar de que tiene exactamente el mismo efecto que float f = 0.0; o float f = 0;.

Por supuesto, es posible que el autor no haya pasado por esta revelación personalmente, es posible que simplemente haya heredado el estilo de otra persona que sí lo hizo.

yo solo escribiria 0.

R.. señala en un comentario y otra respuesta que escribir 0 también tiene el beneficio de que cuando cambias el tipo de f en el futuro, no tiene que actualizar el literal para que coincida. Y si la asignación está separada de la definición, entonces cambiando:

float f = something
// some time later
f = 0.1f;

para:

double f = something;
// some time later
f = 0.1f;

es probablemente un error. mejor usar 0.1 y deje que el compilador se trunque para flotar si es necesario. Probablemente podría argumentar que usar float en absoluto es una optimización, para el espacio, si no para el tiempo, y la carga de lidiar con cualquier diferencia entre float y double debe contarse como un costo para el desarrollador de realizar esa optimización.

Simplemente se considera una buena práctica inicializar una variable con una constante literal del mismo tipo. En este caso, tiene una variable flotante y debe inicializarla con una constante literal flotante, es decir 0.0fen lugar de un int (0) que luego se convierte implícitamente en un flotador.

Bueno, estrictamente hablando, 0 es un número entero, entonces float num = 0 requiere una conversión de entero a flotante. Pero supongo que el compilador hace esto por ti de todos modos. Supongo que la gente usa 0.0f para enfatizar que se trata de un flotante, para que nadie lo confunda con un número entero.

Paul R ha escrito la respuesta. Su segundo ejemplo tiene un valor de inicialización entero.

Siempre debe usar un inicializador del mismo tipo que la variable que se está inicializando. Esto evita cualquier conversión en tiempo de compilación (idealmente) o tiempo de ejecución (compiladores perezosos: ¿hay alguno tan perezoso, sin embargo?). Y quizás lo más importante, la conversión puede conducir a algunas cosas extrañas en el caso general.

Aquí, la conversión debe hacer exactamente lo que se espera, pero sigue teniendo un buen estilo y evita una advertencia del compilador.

avatar de usuario
PyRick

‘f’ indica que quieres un flotante:

0 es un entero

0f es un flotador

0.0 es un doble

0.0f es un flotador

avatar de usuario
Punit Soni

No veo ninguna razón para usar esto para el proceso de inicialización. Pero, para operaciones que involucren literales de coma flotante, esto sería útil. Por ejemplo;

float a=0.43, b;
b = 0.5*a + 2.56*a*a;

Los literales de punto flotante sin sufijo se consideran dobles. Entonces, para este cómputo, “a” se convertirá en doble y la respuesta final de la evaluación RHS será doble. Durante la asignación, el valor doble de RHS se convierte en flotante y se asigna a “b”. Esto degradaría el rendimiento si la máquina no tiene FPU de doble precisión. Para evitar esto y use float para todo el cálculo. Se utilizan sufijos. Por ejemplo,

float a=0.43, b;
b = 0.5f*a + 2.56f*a*a;

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad