al dividir dos resultados enteros truncados a 0 [cerrado]

-1

cuando divido dos enteros y si el resultado es inferior a 0.987, entonces se convierte en cero

uint8_t time = 11;
volatile uint8_t val[2] = {11,12};

return  (uint8_t) (time* (val[0] / val[1]))     // 11 * (11/12)

desde el código anterior, el valor de retorno es 0, (es decir, 11/12 = 0.916, pero se convierte en cero), ¿Alguna otra manera de hacer que el valor devuelto a 11, es 11/12 a 1 no 0?

    
pregunta noob_no1

2 respuestas

4

En la línea

return  (uint8_t) (time* (val[0] / val[1]))     // 11 * (11/12)

la expresión entera (val [0] / val [1]), que se calcula primero debido a los paréntesis, devuelve cero y cualquier cosa multiplicada por cero también es cero.

Si has cambiado esa línea ligeramente para leer

return  (uint8_t) ((time* val[0]) / val[1])     // (11*11)/12)

obtendría la respuesta 10, que está muy cerca del valor real de 121/12.

Las reglas normales para la división de enteros en C es truncar, redondear hacia abajo hacia -ve infinito. Si desea mantener la división de enteros, puede hacer que el redondeo ocurra si lo codifica explícitamente, agregando la mitad de su denominador a su numerador antes de la división.

Si tiene el espacio de código y el tiempo de ejecución, podría usar flotantes para obtener números que reconozca sin tener que preocuparse por el orden de cálculo y el truncamiento.

Una casa intermedia es utilizar la aritmética de enteros de punto fijo, si tiene el espacio de RAM para variables más largas. Trabaje en una base grande como 1000 (para una visualización conveniente de fracciones) o 65536 (para un conveniente corte de números en partes enteras y fraccionarias), y use unit16 o uint32s.

    
respondido por el Neil_UK
1

La división entera M/N en C siempre se redondea, como floor(M/N) haría por flotantes. Una forma común de implementar diferentes reglas de redondeo es:

  • (M+N/2)/N para redondeo equilibrado
  • (M+N-1)/N para el redondeo hacia arriba
respondido por el Dmitry Grigoryev

Lea otras preguntas en las etiquetas