Salida no deseada con modulo operador y ‘pow’

para el siguiente código mostrado

#include #include int main() { int a,i,n=0; int temp=0; scanf("%d",&a); //for number of digits while(temp>=0) { n++; temp = a / pow(10,n); if(temp==0) break; } printf("%d\n",n); for (i=1;i<=n;i++) { temp = a % (int)pow(10,i); printf("%d\n",temp); } return 0; } 

la salida es (la entrada es 123)

 123 3 3 24 123 

Imagen de la salida dada por gcc.

¿Entonces la pregunta es por qué 24 viene en lugar de 23?

compruebe la imagen porque la salida dada por el comstackdor en línea (ideone) es 23. Sólo la salida de gcc tiene 24

Sospecho que pow() no es numéricamente estable en la plataforma que está utilizando. Obtendrá 24 , si pow(10, 2) devuelve un double que es poco menor que 100, por ejemplo, 99.9999999998765, que cuando se convierte a (int) se truncará, resultando en 99 , y así obtendrá 123 % 99 == 24 . Podrías probar cuál es la salida de

 printf("%.100f\n", pow(10, 2)); 

Si ese fuera el caso, y dado que parece que realmente estás haciendo matemática de enteros, tendría otra variable de bucle para múltiplos de 10:

 int tens; for (i = 1, tens = 10; i < n; i++, tens *= 10) { temp = a % tens; printf(tens); } 

(Además, la versión inicial del código tenía los siguientes problemas: la variable int temp; se leyó sin inicializar (y #include faltaba por error). Por lo tanto, el código también tenía un comportamiento indefinido.

El apéndice J2 del estándar C11 dice que, entre otras cosas, el comportamiento de un progtwig no está definido cuando:

Un valor l que designa un objeto de duración de almacenamiento automático que podría haberse declarado con la clase de almacenamiento de register se utiliza en un contexto que requiere el valor del objeto designado, pero el objeto no está inicializado. (6.3.2.1).


PS La condición while (temp >= 0) es innecesaria (y eso es una causa para un comportamiento indefinido), excepto por una manera complicada de asegurar que se ingrese un entero positivo; como romperías de todos modos en temp == 0 , así que podrías reemplazarlo con while (1) )

Veo los siguientes errores:

 while(temp>=0) 

Pero la temp no está inicializada.

 temp = a / pow(10,n); 

pero temp es entero y el cálculo es doble. Pierde precisión, que es la causa probable de su salida incorrecta.