2015-12-02 24 views
10

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,

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.

+0

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

+0

@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? –

+0

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

risposta

1

Questa domanda dipende dall'architettura del computer. Tuttavia, il segno dei numeri in virgola mobile sulle architetture moderne (compresi i core x64 e ARM) è rappresentato da un bit di segno singolo e hanno istruzioni per capovolgere questo bit (ad esempio FCHS). Stando così le cose, possiamo trarre due conclusioni:

  1. Un cambio di segno può essere raggiunto (e indeed is by modern compilers e architetture) da un singolo bit di vibrazione/istruzioni. Ciò significa che il processo è completamente invertibile e non vi è alcuna perdita di precisione numerica.
  2. Non avrebbe alcun senso per MATLAB fare qualcosa di diverso dalla cosa più veloce e più accurata, che è solo per capovolgere quel bit.

Detto questo, l'unico modo per essere sicuri sarebbe di ispezionare il codice assembly per uminus nell'installazione di MATLAB. Non so come farlo.

Problemi correlati