Si consideri ad esempio i seguenti numeri a precisione doppia:Unario meno cambia solo segno?
x = 1232.2454545e-89;
y = -1232.2454545e-89;
Posso essere sicuro che y
è sempre esattamente uguale -x
(o Matlab di uminus(x)
)? O dovrei aspettarmi piccole differenze numeriche dell'ordine o eps
come spesso accade con i calcoli numerici? Prova ad esempio sqrt(3)^2-3
: il risultato non è esattamente zero. Può succedere anche con un unus meno? È lossy come la radice quadrata è?
Un altro modo per porre la domanda sarebbe: è un valore numerico negativo sempre uguale a negare la sua controparte positiva?
La mia domanda si riferisce a Matlab, ma probabilmente ha più a che fare con lo standard IEEE 754 che con Matlab in particolare.
Ho eseguito alcuni test in Matlab con alcuni numeri selezionati a caso. Ho trovato che, in quei casi,
- Risultano uguali.
typecast(x, 'uint8')
etypecast(-x, 'uint8')
differiscono solo nel bit di segno come definito da IEEE 754 double-precision format.
Questo suggerisce che la risposta potrebbe essere affermativa. Se si applica un unus meno solo cambia il bit del segno e non il significato e non si perde alcuna precisione.
Ma ovviamente ho provato solo alcuni casi. Mi piacerebbe essere sicuro che questo accada in tutti i casi.
Sembra che questo potrebbe dipendere dalla [modalità di arrotondamento] (https://en.wikipedia.org/wiki/Floating_point#Rounding_modes). Ti interessano gli interi in particolare o valori arbitrari a virgola mobile. – horchler
@horchler Valori in virgola mobile arbitrari. Sì, suppongo che l'arrotondamento verso lo zero sia necessario perché la risposta sia affermativa. È noto che la modalità di arrotondamento utilizza Matlab? –
Non so. La modalità di arrotondamento predefinita per IEEE-754 è ["simmetrica"] (https://en.wikipedia.org/wiki/Rounding#Round_half_to_even). Immagino che lo usi, anche se può anche dipendere dal sistema. – horchler