[C++] Proprietà associativa e float
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\]
Ad esempio si potrebbe avere \[(1+\text{NumeroMoltoAlto})-\text{NumeroMoltoAlto}=0 \ne1+
(\text{NumeroMoltoAlto}-\text{NumeroMoltoAlto})=1\]
Risposte
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.
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.
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.
\[(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.
Chiarissimi, grazie!