Newsgroup: it.comp.programmare.win32
Titolo: [MSVC] Risultati assurdi con double

Aiuto ragazzi!
La mia prof di mate si è accorta di qualche errore nel mio programma per
plottare funzioni!
Quando il risultato di una funzione è infinito, come ad esempio
log<e>(radq(0)), come faccio a capirlo?
Internamente, la variabile assume il valore -1.#INF000000000, ma non riesco
a fare un if per intercettarlo...
Idem per quando non è definito, come sen(log<e>(radq(0)))...
Ho inoltre sentito parlare delle eccezioni floating point. Cosa sono?
Possono essermi utili? Se si, come si usano?
Purtroppo non ho MSDN e la bolletta è troppo alta per usare intensivamente
quella online...
Thanks
Kojak
vrke...@hotmail.com
http://space.tin.it/io/viscorci

 Purtroppo non ho MSDN e la bolletta č troppo alta per usare intensivamente


 > log<e>(radq(0)), come faccio a capirlo?
Ci dovrebbe essere, definita da qualche parte, una costante di nome MAX_INT
(immagino ci siano anche MAX_FLOAT, MAXDOUBLE e via dicendo).
queste costanti rappresentano il bound superiore del range di validita' di
una variabile, finito in quanto finiti sono i bit di memoria messi a
disposizione della variabile...
ok?
Ciao, Davide.

 a fare un if per intercettarlo...
Ogni libreria di calcolo floating point definisce le opportune macro per
i numeri "speciali". Ad esempio per le funzioni ANSI di <math.h> la
costante che "rappresenta" gli infiniti e` INF. Se invece vuoi
identificare un risultato NaN (Not a Number) devi usare la macro
isnan().
Se vuoi gestire in modo "custom" gli errori devi ridefinire la funzione
matherr(), che tutte le funzioni di math.h chiamano quando vanno in
errore.
... If you want your name spelt wrong, die.
---
Bye! Lorenzo Lutti
http://www.geocities.com/SiliconValley/Peaks/6258/

 disegni, altrimenti niente.
Il problema è che la funzione non so quale sia a priori, viene decifrata da
un parser!
Quando vado a fare una funzione semplice non c'è problema, ma quando sono
annidate, come nel mio esempio, basta che una restituisca un valore non
valido e tutte
le altre sballano!
Non posso interrompere il parsing se ci sono valori errati, il parser non
l'ho fatto io, anche se mi sa che farei meglio a farmene uno io... Grazie
comunque! Intanto ho scoperto che HUGE_VAL vale per -1.0#IND00... ed un
problema è andato!
Kojak
vrke...@hotmail.com
http://space.tin.it/io/viscorci

 valido e tutte le altre sballano!
Puoi gestire le "eccezioni strutturate" con i costrutti __try / __except del
MSVC (comuni anche ad altri compilatori C o C++ per Win32, ma non tutti).
Affinche` le anomalie floating-point causino eccezioni cosi` gestibili,
devi cambiare la control-word della Floating-Point Unit (FPU) con la
chiamata _controlfp delle librerie run-time del MSVC (e altri simili
compilatori).  #include <float.h>, poi inserisci la chiamata
    _controlfp(_MCW_EM, _EM_INVALID|_EM_ZERODIVIDE);
se ad esempio e` per questi due specifici casi che desideri ricevere
una eccezione (probabilmente vorrai aggiungere anche il caso
_EM_OVERFLOW ma non altri).  Incidentalmente, questa stessa
funzione ti permette anche di controllare l'arrotondamento e la
gestione dell'infinita` (affine ovvero proiettiva).
Le funzioni matematiche, ammesso che tu le usi, possono non
causare questo tipo di eccezioni, bensi` invece settare la variabile
(o pseudovariabile, per i pignoli:-) chiamata errno.  Devi dunque
anche controllare errno dopo ogni chiamata.  Oppure, per assai
maggior comodita`, definisci una tua funzione chiamata...:
    int _matherr( struct _exception *except );
Essa verra` chiamata ad ogni "errore matematico" identificato
dalle librerie, e in essa puoi scegliere di sollevare tu stesso
eccezioni di tipo strutturato per "riportarti al caso precedente"
(gestirle poi cioe` dentro il tuo __try / __except).
Un #include <math.h> ti fornira` la definizione della struct
_exception.
Alex