Si scrivo in c, ed' intendevo ambiente a run time! Comunque ho risolto. Non avevo pensato al fatto che l'operatore " / ", in c è sovraccaricato, cosi che sia possibile float/float=float , int/int=int e int/int=float. Per le frazioni eterogenee tipo int/float penso che il compilatore esegua un cast implicito in questo modo (float)int / float.
Naturalmente essendo inf e nan, codificati in dei float, la divisione int/int=int non potrà mai restituire uno di questi risultati, ecco perché viene generata un'eccezione in virgola mobile ed il programma restituisce il controllo all'OS prematuramente.
Per concretizzare, in laboratorio scrissi:
codice:
printf("\t%f", 0.0/0.0);
Mentre a casa:
codice:
printf("\t%f", 0/0);
Per correggere:
codice:
printf("\t%f", (float) 0/0);
Alcuni casi che generano eccezioni:
codice:
#include<stdio.h>
#include<math.h>
int main()
{
float inf = (float) 1/0;
printf("1\t%f\n", -inf );
printf("2\t%f\n", 1/inf );
printf("3\t%f\n", 0.0/0.0 );
printf("4\t%f\n", inf/inf );
printf("5\t%f\n", inf-inf );
printf("6\t%f\n", inf+inf );
printf("7\t%f\n", inf*inf );
printf("8\t%f\n", pow(inf , 2) );
printf("9\t%f\n", sqrt(-1) );
printf("10\t%f\n", sqrt(inf) );
return 0;
}
Ed'ecco i rispettivi output:
codice:
dante@dante-PC:~/Documenti/c/Matematica$ ./limiti
1 -inf
2 0.000000
3 -nan
4 -nan
5 -nan
6 -inf
7 inf
8 inf
9 -nan
10 -nan
Come vediamo questi oggetti sono estremamente maneggevoli possiamo passare da +inf a -inf semplicemente anteponendo il segno non sono due oggetti distinti. Ciò è ragionevole dal momento che nello standard IEEE v'è un bit della stringa (il più significativo) dedicato al segno, dal momento che la codifica di inf e nan utilizza esclusivamente i bit dedicati alla mantissa e all'esponente; il flag di segno rimane disponibile per il suo scopo.