View Full Version : Beccare l'eccezione della divisione per zero.
Mi si è presentato un problema:
Numeratore e denominatore sono due sommatorie e gia bestemmiavo perchè il den.
poteva uscire zero.
Poi mi sono accorto (nello specifico della mia funzione) che se usciva zero al denominatore anche il numeratore
era zero.E poichè sembra che il compilatore (Borland 5.5)gestisca nomalmente 0/0 come 0 non dovrei avere
problemi o sbaglio?Questo è il dubbio .
Non volendomi fermare a questo caso particolare chiedo:
come posso intercettare in C++ l'eccezione particolare della divisione per zero(che non riesco a trovare)
e maneggiare gli altri tipi di eccezioni separatamente nella stessa funzione?
Grazie
P.S
Odio la documentazione della stl borland perchè non trovi mai quello che vuoi,
perche nel documentare una funzione 9 su 10 non mette l'header che devi inserire,
e perchè secondo me l'ha scritta qella zo..ola raccomandata dell'amante del signor Borland. :mad:
lombardp
02-04-2003, 16:04
Dai un'occhiata alla funzione matherr, dovrebbe riguardare la gestione dell'eccezione che cerchi.
MickMacello
02-04-2003, 22:25
Lombardp: il tuo avatar... uno mi sembra P.A.M. Dirac, ma l'altro chi è ?
Originally posted by "verloc"
Mi si è presentato un problema:
Numeratore e denominatore sono due sommatorie e gia bestemmiavo perchè il den. poteva uscire zero.
....
:mad:
Ce le fai vedere (num e den) ?
lombardp
03-04-2003, 11:26
Originally posted by "MickMacello"
Lombardp: il tuo avatar... uno mi sembra P.A.M. Dirac, ma l'altro chi è ?
(OT)
E' sempre Dirac... in altra età.
NB: Complimenti: sei il terzo ad averlo riconosciuto.
(/OT)
Originally posted by "a2000"
Ce le fai vedere (num e den) ?
Eccola
xc=(Sommatoria Kui*Yui*sin^2alfa_i)/(Sommatoria Kui*sin^2alfa_i)
è un baricentro di rigidezze,tu mi dovresti capire.
quando tutti gli alfa sono zero viene xc=0/0 ed inquesto caso
devo prendere provvedimenti pechèi l risultato non può essere adoperato così come è,ma deve essere corretto.
Mi sa che l'eccezione divide by zero non è nello standard ma è machine dependent.Quindi forse dovrei usare windows.h
Non la prendo nenche con quella quella generale (...)
Secondo questo qui invece dovrebbe :eek: .
http://pmode.impazz.it/tuts/exceptions.htm
Cmq per il mio caso non devo usare eccezioni.
lombardp
03-04-2003, 13:57
L'esempio che hai riportato "catturava" l'eccezione sull'operazione tra interi.
Questo codice EXCEPTION_FLT_DIVIDE_BY_ZERO dovrebbe essere quello per numeri floating point.
In ogni caso ti riporto la descrizione della funzione matherr :
The _matherr function processes errors generated by the floating-point functions of the math library. These functions call _matherr when an error is detected.[/b]
Originally posted by "lombardp"
L'esempio che hai riportato "catturava" l'eccezione sull'operazione tra interi.
Questo codice EXCEPTION_FLT_DIVIDE_BY_ZERO dovrebbe essere quello per numeri floating point.
In ogni caso ti riporto la descrizione della funzione matherr :
The _matherr function processes errors generated by the floating-point functions of the math library. These functions call _matherr when an error is detected.[/b]
Si l'ho vista negli headers grazie ;)
Quella che non funziona è la generica (...) sempre ammesso che non si debba ricorrereper forza a windows.h (che è nu casin')
E te pareva:
_matherr and _matherrl are useful for information on trapping domain and range errors caused by the math functions. They do not trap floating-point exceptions, such as division by zero.
See signal for information on trapping such errors
Pare che si debbano usare raise e signal,c'è l'esempio proprio sulla divisione.
L'unico vantaggio (mi pare) rispetto ad una equivalente eccezione,è quello di poter maneggiare la cosa
con un user-handler senza far crashare tutto.
Originally posted by "verloc"
Eccola
xc=(Sommatoria Kui*Yui*sin^2alfa_i)/(Sommatoria Kui*sin^2alfa_i)
è un baricentro di rigidezze,tu mi dovresti capire.
quando tutti gli alfa sono zero viene xc=0/0 ed inquesto caso
devo prendere provvedimenti pechèi l risultato non può essere adoperato così come è,ma deve essere corretto.
...
Ci sono diversi approcci: analitici, semianalitici, numerici, alla C++
Analitici: trasformare la funzione (sempre che non sia nata male a monte);
Semianalitici: interpolare con una funzione ausiliaria nell'intorno dello 0;
Numerici: branching per den=0; num / (den + macheps) [un classico];
alla C++: intercettazione dell'errore.
Approccio normale:
calcolo num e den separatamente :
se den=0 allora ...l'edificio becca la torsione solo dalla componente ydel sisma.
Questo mi permette sotto certe condizioni di esaminare anche la parete singola.
Ma vuol dire anche che se l'utente mi mette 10 pareti tutte con angolo 0 allora è così ca..one da pensare che un edificio regga
ad un sisma con le pareti orientate solo in una direzione :eek:
Originally posted by "a2000"
Ci sono diversi approcci: analitici, semianalitici, numerici, alla C++
....
Numerici: branching per den=0; num / (den + macheps) [un classico];
spiegati meglio , devi fare sempre il criptico? :)
Originally posted by "verloc"
Approccio normale:
calcolo num e den separatamente :
se den=0 allora ...l'edificio becca la torsione solo dalla componente ydel sisma.
Questo mi permette sotto certe condizioni di esaminare anche la parete singola.
Ma vuol dire anche che se l'utente mi mette 10 pareti tutte con angolo 0 allora è così ca..one da pensare che un edificio regga
ad un sisma con le pareti orientate solo in una direzione :eek:
Certe volte gli "utenti" sono (inconsapevolmente) meno C++zoni di quel che sembrano: anche se le pareti sono tutte orientate in una stessa direzione sono in realtà anche orientate in quella ortogonale (e tutte le altre) perchè ... hanno uno spessore > 0!
Ti complica un pò la vita ?
però il tuo modello diventa più fisico e infatti ti toglie dai C++ le forme indeterminate di cui sopra.
Per la numerica, mai fatto:
Calcolo num, den
If Abs(den) > 1e-25 Then
f = num/den
Else
f = valore limite
End If
oppure come si dice "sporcare" il denominatore:
f = num / (den + 1e-25)
ho messo 1e-25 ma dovrebbe essere calcolato a rigore in base al macheps della macchina.
P.S.
sono criptico per evitare guai. :)
hai ragione a2000 sò stato criptico pure io :)
In realtà l'analisi viene fatta per una direzione orientata del sisma fra 0 e 360 scelta dall'utente.
Si trascura la rigidezza della parete rettangolare lungo il lato corto(quella di minore inerzia).
Quindi se il sisma è orientato secondo 0 e tutti i lati lunghi delle pareti sono a 90 gradi l'edificio va giù.Quindi la componente del centro delle rigidezze secondo y perde di significato e non che diventa zero.La correzione consiste nell'assumere yc =yg(compon secondo y del centro di massa).Il che vuol dire che la torsione la può dare solo la componente y del sisma.
Se il sisma ha componente secondo x diversa da zero si avverte l'utente che si sta facendo una ca..ata.
Spero di essere stato chiaro :(
Ovviamente mi scuso con chi non è un ingegnere.
Perchè per evitare guai?!?
Originally posted by "a2000"
Per la numerica, mai fatto:
Calcolo num, den
If Abs(den) > 1e-25 Then
f = num/den
Else
f = valore limite
End If
oppure come si dice "sporcare" il denominatore:
f = num / (den + 1e-25)
ho messo 1e-25 ma dovrebbe essere calcolato a rigore in base al macheps della macchina.
P.S.
sono criptico per evitare guai. :)
adesso è chiaro ;)
Originally posted by "verloc"
hai ragione a2000 sò stato criptico pure io :)
...
Perchè per evitare guai?!?
Fortunatamente (?) molte cose le dimentichiamo.
Soprattutto quelle peggiori.
Originally posted by "a2000"
Fortunatamente (?) molte cose le dimentichiamo.
Soprattutto quelle peggiori.
Sembra che io e te ci si capisca al volo (sulle cose non troppo "tecniche")
Chi l'avrebbe mai detto ?
;)
Preciso:
Fortunatamente molte cose te le sei dimenticate.
Soprattutto le peggiori che hai fatto.
P.S.
l'occhiolino fa un filino fr+C++, preferisci una sana pernacchia (pucchiacchia) partenopea :p
Quella volta mi avevi davvero fatto incazzare (non l'ho dimenticato).
Poi siccome sei intelligente(e molto) hai capito dove sbagliavi.
Che adesso mi piacevi (si fa per dire) te lo volevo dire da parecchio.
Sbagliavi soltanto perchè un poveretto apprendista chiedeva aiuto su una cosa specifica c++
e tu gli rispondevi a bastoni rincoglionendolo :D.
Cmq non sono di origine napoletana e me piacene' e ' femmene. :p
Il fatto che adesso mi piaci "non è detto che si debba fare lingua in bocca".
Di chi è la citazione?
Clint Eastwood: "Gunny"
Adesso chiudiamo il topic se no mi devo autocazziare per il divago :(
vBulletin® v3.6.4, Copyright ©2000-2026, Jelsoft Enterprises Ltd.