Newsgroup: it.comp.lang.c++
Titolo: Calcolo modulo vettore

Ciao di nuovo a tutti,
sapete se esiste qualche metodo per calcolare il modulo di un vettore (o
di un segmento) senza ricorrere ad operazioni tipo sqrt(), sin(), cos()
etc.. che sono "naturalmente" imprecise, introducono cioè degli errori
di precisione nei risultati dei loro calcoli.
Per il progetto che sto implementando è assolutamente necessaria una
virtuale esattezza delle operazioni utilizzate, se ben ricordo tutte
quelle citate non lo sono.
Grazie a chi sa dirmi qualsiasi cosa al riguardo.
Gianluca

 quelle citate non lo sono.
Nessuna operazione a virgola mobile e` "virtualmente esatta".  Fra
tutte, la moltiplicazione, la somma di numeri con lo stesso segno, e
la radice quadrata, sono le piu` precise (ragionevolmente implementabili
con 1 ULP di approssimazione).
Se vuoi usare una formula cosi` instabile che poche ULP di
approssimazione (quali ottieni chiedendo la radice quadrata della
somma dei quadrati dei componenti) non sono accettabili, bisogna
rifare l'analisi ab ovo e trovare un equivalente piu` stabile, se no
l'aritmetica a virgola mobile non fa proprio al caso tuo (e anche
gli approcci piu` precisi, e MOLTO piu` lenti, che si possono
adottare come alternativa a livello di aritmetica, non penso che
ti sarebbero di grande aiuto pratico).
Alex

 wrote :
| sapete se esiste qualche metodo per calcolare il modulo di un vettore (o
| di un segmento) senza ricorrere ad operazioni tipo sqrt(), sin(), cos()
| etc.. che sono "naturalmente" imprecise, introducono cioč degli errori
| di precisione nei risultati dei loro calcoli.
be' il modulo e' definito proprio come la sqrt della somma dei quadrati dei
componenti, e oltre a radici e trigonometria, non puoi fare altro.
Per "l'esattezza", non esiste in ambito di rappresentazioni numeriche con
numeri limitati di bit: anche il semplice 1/3 e' "approssimato" su un long
long double. Per una precisione assoluta, ti servono numeri infiniti, e
infiniti bit.
Per ridurre l'errore potresti lasciare i calcoli in forma "simbolica" come
1/3, sqrt(2) e semplificando, fino al momento dell'effettivo calcolo,
riducendo cosi' l'errore. Ma e' una brutta bestia da realizzare.

quelle citate non lo sono.
Tutte le operazioni in virgola mobile hanno un certo grado di
imprecisione...
Se necessiti della massima precisione devi fare una accurata analisi
riguardo il condizionamento del problema che vuoi trattare e la
stabilita` del tuo algoritmo (cercando eventualmente di trovarne
una versione piu` stabile che non usi certe operazioni).
Paolo

Ciao ancora,
vorrei precisare, visto che la discussione ha preso una piega da me non
voluta (però è proprio questo il bello dei newsgroup ;-)) ), che la mia
domanda era questa:
posso implementare una funzioneper il calcolo del modulo di un vettore
senza l'utilizzo di sen, cos, o sqrt...?
So benissimo che qualsiasi operazione, quando si tratta con macchine di
calcolo, è approssimata data l'impossibilità, ad esempio, di
rappresentare numeri irrazionali, oppure data la limitatezza delle cifre
decimali implicitamente imposta dai calcolatori stessi.
Perciò attualmente utilizzo dei numeri razionali, rappresentati cioè da
una frazione num / den. Ora, le operazioni "classiche" le ho
implementate, dopo aver ben studiato il condizionamento di ognuna di
queste (e per questo parlavo di aritmetica "virtualmente" esatta), ma
altre operazioni hanno un condizionamento, a quanto mi risulta,
sicuramente peggiore.
Da qui la domanda precedentemente postata.
Gianluca

 wrote:
| posso implementare una funzioneper il calcolo del modulo di un vettore
| senza l'utilizzo di sen, cos, o sqrt...?
Per me no. Ma se vuoi un parere + autorevole, cerca su Numerical recipes
(e' un libro per il C, ma una funzione  e' una funzione :-)
http://www.ulib.org/webRoot/Books/Numerical_Recipes/

Secondo me potresti approssimare le funzioni seno coseno e sqrt mediante i
polinomi di mac laurin facendo quindi uso di potenze e di fattoriali ma
ovviamente sarebbe un´approssimazione di quelle funzioni e quindi non so se
per te conta di piu´ la precisione o il tempo di calcolo.
Ciao

 wrote :

Perche', come credi che le calcolino le librerie?