Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Standard IEEE su Nan e Inf
Forum - C/C++ - Standard IEEE su Nan e Inf

Avatar
Dante.cpp (Normal User)
Pro


Messaggi: 65
Iscritto: 23/11/2011

Segnala al moderatore
Postato alle 16:53
Giovedì, 06/12/2012
Ho la necessità di rappresentare infinito e forma indeterminata, in dei float, in primo luogo ho pensato di utilizzare rispettivamente il massimo e il minimo, numero float rappresentabile nella mia macchina. Ma cosi facendo avrei dovuto fare io i controlli sulle divisioni per vedere se il quoziente è reale, infinito, nullo oppure indeterminato. Allora frugando un po qua e la, e facendo alcuni esperimenti con il codice; scopro che lo standard IEEE che regola la codifica binaria dei numeri in virgola mobile, ha già definito i valori inf e Nan( not a number ) ossia forma indeterminata. L'infinito "inf" è codificato ponendo tutti i bit dell'esponente a 1 e tutti quelli della mantissa a zero, mentre "Nan" ha l'esponente sempre tutto a 1 e la mantissa diversa da 0.
Il bello di ciò è che, se noi facciamo ad'esempio 4/0 e poi stampiamo l'ambiente ci restituisce inf oppure ci restituisce nan se facciamo 0/0. Questi test li ho fatti nel laboratorio della mia facoltà, sotto ubuntu 8.10.
Ho provato a emulare gli esperimenti fatti in laboratorio con il mio pc sotto ubuntu 12.10; pero anziché rispondermi con le preziose informazioni che ormai m'aspettavo, l'ambiente a real time mi dice esclusivamente "Eccezione in virgola mobile" sia che si trati di inf, che di nan.  

Qualche suggerimento?


PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 18:38
Giovedì, 06/12/2012
Devi disabilitare le eccezioni se non vuoi che il programma termini:

http://linux.die.net/man/3/feenableexcept
http://linux.die.net/man/3/fedisableexcept




Il mio blog: https://piero.dev
PM Quote
Avatar
Dante.cpp (Normal User)
Pro


Messaggi: 65
Iscritto: 23/11/2011

Segnala al moderatore
Postato alle 2:11
Venerdì, 07/12/2012
Queste mi torneranno utili, comunque sia il problema era più banale; naturalmente l'operatore " / " è sovraccaricato cosi che, sia possibile la divisione fra interi come tra reali. Nella divisione eterogenea intero/reale, reale/intero penso vi sia un cast implicito per convertire l'intero in reale.
Sta di fatto che io in laboratorio ho scritto:
Codice sorgente - presumibilmente Plain Text

  1. printf("\t%f\n", 0.0 / 0.0 );



mentre a casa:
Codice sorgente - presumibilmente Plain Text

  1. printf("\t%f\n", 0/0 );



correggibile con:
Codice sorgente - presumibilmente Plain Text

  1. printf("\t%f\n", (float) 0/0 );



Ecco un paio di casi che generano eccezioni:
Codice sorgente - presumibilmente C/C++

  1. #include<stdio.h>
  2. #include<math.h>
  3.  
  4. int main()             
  5. {      
  6.         float inf = (float) 1/0;
  7.        
  8.         printf("1\t%f\n", inf );
  9.         printf("2\t%f\n", 1/inf );
  10.         printf("3\t%f\n", 0.0/0.0 );
  11.         printf("4\t%f\n", inf/inf );
  12.         printf("5\t%f\n", inf-inf );
  13.         printf("6\t%f\n", inf+inf );
  14.         printf("7\t%f\n", inf*inf );
  15.         printf("8\t%f\n", pow(inf , 5) );
  16.         printf("9\t%f\n", sqrt(-1) );
  17.         printf("10\t%f\n", sqrt(inf) );
  18.        
  19.         return 0;
  20. }

    

e i rispettivi output:
Codice sorgente - presumibilmente Plain Text

  1. dante@dante-PC:~/Documenti/c/Matematica$ ./limiti
  2. 1       inf
  3. 2       0.000000
  4. 3       -nan
  5. 4       -nan
  6. 5       -nan
  7. 6       inf
  8. 7       inf
  9. 8       inf
  10. 9       -nan
  11. 10      inf



Ultima modifica effettuata da Dante.cpp il 07/12/2012 alle 2:15
PM Quote