In realtà, in questa domanda non chiedo di un particolare linguaggio o architettura, tuttavia capisco che potrebbero esserci alcune differenze.
In fisica / ingegneria di solito è meglio gestire numeri più grandi di quelli più piccoli, a causa della migliore precisione assoluta. Per esempio quando ho bisogno di calcolare l'area di un cerchio, avendo il suo diametro, userei l'equazione S = d * d / 4 * pi
piuttosto che S = pi * (d / 2) * (d / 2)
(in entrambi i casi calcolando da sinistra a destra).
Come appare nei linguaggi di programmazione?
È importante fornire un ordine "migliore" di argomenti? Ci sono dei compilatori che possono ottimizzare il calcolo per questo?
Queste costruzioni hanno un senso:
// finding a result of a*b/c
if (abs(c)<1){
result = a / c * b;
} else {
result = a * b / c;
}
(nell'esempio si dovrebbero testare anche i valori di a
e b
ma assumiamo che siano numeri grandi)?
So che usando numeri troppo grandi sto rischiando un overflow. So che c'è una differenza tra i numeri interi (che sono migliori in addizione / sottrazione) e float (che sono migliori in moltiplicazione / divisione).
C'è anche un problema con la divisione intera, per esempio in Pascal c'è un comune operatore di moltiplicazione *
e se entrambi i numeri sono Integer
, il risultato è anche Integer
, se uno di questi è Real
( equivalente a float
), anche il risultato è Real
. Per la divisione ci sono due operatori: /
che risulta sempre con Real
numero e div
che prende solo Integer
s e il risultato è Integer
. Quindi in questa lingua sarebbe meglio calcolare prima le moltiplicazioni e poi le divisioni perché le divisioni Integer
potrebbero portare a perdere la parte frazionaria, ed è meglio perderla più tardi rispetto a prima.
Ma per float
numeri, che sono memorizzati con mantissa e esponente l'ordine di moltiplicazioni / divisioni sembra non essere necessario.
Quello che voglio ottenere è il risultato più preciso possibile (la velocità non è necessaria)