Newsgroup: it.comp.lang.visual-basic
Titolo: [?!][VB.NET] Math.Tan: quando da errore?

? tan(pi*.5)
16331778728383844.0
come vedete, Tan(pi/2) non da errore o +infinto o NaN, ma un normalissimo
nuero (be', in effetti piuttosto alto...)
C'è qualcuno che ha risolto questo problema, che diventa seccante quando
devo verificare se un'operazione è valida o no?

I controlli li devi fare in base al dominio... essendo la tangente,
controlli che non sia pi/2 (+ eventuale periodo). Le approssimazioni portano
a valori sballati. Al di là dei controlli... potresti, in maniera non troppo
elegante, verificare se il numero è più grande di un determinato parametro
(per es. 100000000) dipendente dall'applicazione, per giungere a conclusione
che si tratta di infinito o di non esistenza nel dominio. Comunque i
controlli sono sempre preferibili... la seconda è una soluzione 1)brutta 2)
non sempre veritiera
perché se io ti dessi il valore pi/2 - 0,000000000001... probabilmente il
valore della tangente sarebbe spaventosamente grande... ma non sarebbe non
esistente o tendente a infinito.
Spero di essermi spiegato.
Kind Regards,
--
Antonio Cangiano
Webmaster di 
www.visualcsharp.it
Fondatore di free.it.comp.lang.csharp

 ha scritto nel
messaggio news:A%a39.35979$lu5.1...@twister1.libero.it...


>chissà se anche il C# ed il C++ si comportano così...
Anche in c++ e c# il comportamento è identico. Stesso identico valore.
Il motivo è che, l'approssimazione in formato double del pigreco implica una
bella perdita di
"informazione" che si riscontra nel calcolo della tangente.
Il valore di PIGRECO approssimato a 500 cifre è:
3.141592653589793238462643383279502884197169399
3751058209749445923078164062862089986280348253
4211706798214808651328230664709384460955058223
1725359408128481117450284102701938521105559644
6229489549303819644288109756659334461284756482
3378678316527120190914564856692346034861045432
6648213393607260249141273724587006606315588174
8815209209628292540917153643678925903600113305
3054882046652138414695194151160943305727036575
9591953092186117381932611793105118548074462379
9627495673518857527248912279381830119491
Ora in C# dobbiamo accontentarci del tipo decimal con le sue 28 cifre
significative
=> dobbiamo prendere solo le 27 cifre dopo la virgola, per testare il
miglioramento, rispetto
all'uso del double per pi tipico della classe math. Tuttavia dovremmo fare
l'overload del metodo
Math.Tan... per cui... essendo particolarmente laborioso... direi che la
patch del controllo è la scelta
migliore. Anche Microsoft credo, non abbia di meglio da proporci. E' vero
che da dotnet si sperava di meglio,
ma tieni conto che non è colpa di dotnet, ma del calcolatore e della sua
incapacità dovuta alla rappresentazione binaria e soprattutto
alla discretizzazione di ciò che è continuo. Sarebbe interessante creare
delle classi con overload dei membri,
già esistenti, al fine di inserire dei controlli integrati. (Beh... questo
senza dubbio, poteva già farlo Microsoft).
Si è pensato molto al web, e ad altre caratteristiche "moderne", e come al
solito... si sono trascurate alcune,
cosucce matematiche... i cui danni, potevano essere limitati. Ripeto... se
lavori molto con i conti matematici,
fatti delle librerie tue.
Best Regards,
