[C++] Proprietà associativa e float

Cip Upupa
Ciao a tutti! Ho una domanda: perché la proprietà associativa può non essere garantita in un computo che coinvolge dei float o dei double? Per questioni di arrotondamento? Oppure è perché quando si ha a che fare con numeri molto alti, il calcolatore non tiene conto di somme ulteriori?

Ad esempio si potrebbe avere \[(1+\text{NumeroMoltoAlto})-\text{NumeroMoltoAlto}=0 \ne1+
(\text{NumeroMoltoAlto}-\text{NumeroMoltoAlto})=1\]

Risposte
xneo1
Dipende dal tipo di standard usato per rappresentare il numero in virgola mobile.
Se lo standard è IEEE754, a causa di una somma o di un'altra operazione che causi un overflow potrebbe capitare che il risultato o sia uguale al massimo valore possibile o sia un INFINITY.

Intuitivamente puoi vedere la cosa in questo modo.
numeroMoltoAlto può essere un numero nell'ordine di 10^300. Se a questo numero aggiungi 1, capisci che 1 è trascurabile rispetto a numero molto alto. In generale se n>>m allora n+m può essere approssimato a n senza molti problemi.

apatriarca
Come già detto da xneo, \(1 \oplus x\) potrebbe essere uguale a \(x\) per valori alti e quindi avere (per \(x\) sufficientemente alto - per esempio \(2^{64}\))
\[(1 \oplus x) \ominus x = x \ominus x = 0 \neq 1 \oplus (x \ominus x) = 1 \oplus 0 = 1.\]
Nota che questo è un esempio eclatante, ma vale molto più in generale. L'ordine delle operazioni è importante quando si lavora con valori in virgola mobile.

Cip Upupa
Chiarissimi, grazie!

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.