¿Por qué la división da como resultado cero en lugar de un decimal?

5 minutos de lectura

avatar de usuario
chef flambeado

Enseñándome a mí mismo C y descubriendo que cuando hago una ecuación para una conversión temporal no funcionará a menos que cambie la fracción a un decimal. es decir,

tempC=(.555*(tempF-32)) funcionará pero tempC=((5/9)*(tempF-32)) no funcionará

¿Por qué?
De acuerdo con el libro “C Primer Plus”, debería funcionar ya que estoy usando flotadores tanto para tempC como para tempF.

  • ¿Responde esto a tu pregunta? ¿Cuál es el comportamiento de la división de enteros?

    – cién

    27 de febrero a las 16:32

Parece que tienes una división de enteros en el segundo caso:

tempC=((5/9)*(tempF-32))

Él 5 / 9 se truncará a cero.

Para solucionarlo, debe convertir uno de ellos en un tipo de punto flotante:

tempC=((5./9.)*(tempF-32))

  • Para ser exigente, la sintaxis 5.0 / 9.0 da dos dobles. Si tempF y tempC son float entonces la expresión debería ser 5.0f / 9.0f. De lo contrario, la división podría realizarse con precisión doble, que luego se redondea a precisión flotante cuando se almacena su resultado. Con suerte, el compilador es lo suficientemente inteligente como para optimizar ese pequeño problema menor, pero no contaría con eso.

    – Lundin

    18 de enero de 2012 a las 12:53

  • @Lundin no puede optimizar eso; si se usa doble precisión, debe hacerse de esa manera, o puede surgir una respuesta inesperada.

    – rubenvb

    16 de julio de 2013 a las 14:40

avatar de usuario
Divya

Cuando haces 5/9, 5 y 9 son enteros y División entera sucede El resultado de la división de enteros es un número entero y es el cociente de los dos operandos. Entonces, el cociente en el caso de 5/9 es 0 y como multiplicas por 0, tempC resulta ser 0. Para no tener división de enteros, al menos uno de los dos operandos debe ser float.

Por ejemplo, si usa 5.0/9 o 5/9.0 o 5.0/9.0, funcionará como se esperaba.

5/9 es una división entera, no una división de punto flotante. Es por eso que está obteniendo un resultado incorrecto.

Haga 5 o 9 variables de coma flotante y obtendrá la respuesta correcta.

Como 5.0/9 O 5/9.0

  • Acordado. Siempre es una buena práctica agregar también el f que denota punto flotante a constantes. Así mismo el u para constantes enteras sin signo

    – Andrés

    27/10/2012 a las 20:32

5/9 es una expresión entera, como tal, se trunca a 0. Su compilador debería advertirle sobre esto, de lo contrario, debería considerar habilitar las advertencias.

avatar de usuario
Sr. Lister

Si pones 5/9 entre paréntesis, esto se calculará primero, y como son dos enteros, se hará por división de enteros y el resultado será 0, antes de evaluar el resto de la expresión.

Puede reorganizar su expresión para que la conversión a flotante ocurra primero:

tempC=((5/9)*(tempF-32));tempC=(5*(tempF-32))/9;

o por supuesto, como dicen los demás, usar constantes de punto flotante.

  • Incluso si no estuvieran entre paréntesis, aún podrían evaluarse como números enteros. El orden de evaluación de esta expresión es un comportamiento no especificado en C, el compilador puede optar por evaluar de izquierda a derecha o de derecha a izquierda, y no puede saber qué orden de evaluación se aplica.

    – Lundin

    18 de enero de 2012 a las 7:57


  • No del todo cierto. ¡Los paréntesis tienen un efecto! Si se asegura de que el primer cálculo que se realiza da como resultado un número flotante, el resto de la expresión no volverá a ser un número entero. He aumentado mi respuesta para mostrar lo que quiero decir.

    – Señor Lister

    18 de enero de 2012 a las 8:33

  • El ejemplo reescrito no es equivalente a quitar el paréntesis, ha cambiado intencionalmente el orden de evaluación. tempC= 5/9 * (tempF-32); es un ejemplo con el paréntesis eliminado. Este ejemplo puede dar o no el resultado deseado, dependiendo de si el compilador evalúa de izquierda a derecha o de derecha a izquierda; se basa en un comportamiento no especificado.

    – Lundin

    18 de enero de 2012 a las 12:02


  • No estoy seguro de lo que estás tratando de probar aquí. Mi ejemplo reescribió la expresión del OP para que funcione. Que es lo que pidieron.

    – Señor Lister

    18 de enero de 2012 a las 13:07

  • Incluso si no estuvieran entre paréntesis, aún podrían evaluarse como números enteros. El orden de evaluación de esta expresión es un comportamiento no especificado en C, el compilador puede optar por evaluar de izquierda a derecha o de derecha a izquierda, y no puede saber qué orden de evaluación se aplica.

    – Lundin

    18 de enero de 2012 a las 7:57


  • No del todo cierto. ¡Los paréntesis tienen un efecto! Si se asegura de que el primer cálculo que se realiza da como resultado un número flotante, el resto de la expresión no volverá a ser un número entero. He aumentado mi respuesta para mostrar lo que quiero decir.

    – Señor Lister

    18 de enero de 2012 a las 8:33

  • El ejemplo reescrito no es equivalente a quitar el paréntesis, ha cambiado intencionalmente el orden de evaluación. tempC= 5/9 * (tempF-32); es un ejemplo con el paréntesis eliminado. Este ejemplo puede dar o no el resultado deseado, dependiendo de si el compilador evalúa de izquierda a derecha o de derecha a izquierda; se basa en un comportamiento no especificado.

    – Lundin

    18 de enero de 2012 a las 12:02


  • No estoy seguro de lo que estás tratando de probar aquí. Mi ejemplo reescribió la expresión del OP para que funcione. Que es lo que pidieron.

    – Señor Lister

    18 de enero de 2012 a las 13:07

¿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