2015-12-02 9 views
10

Betrachten Sie zum Beispiel die folgenden Zahlen mit doppelter Genauigkeit:Ändert ein Minuszeichen nur das Vorzeichen?

x = 1232.2454545e-89; 
y = -1232.2454545e-89; 

Kann ich sicher sein, dass y immer genau gleich -x (oder Matlab uminus(x)) ist? Oder sollte ich kleine numerische Unterschiede der Ordnung oder eps erwarten, wie es oft bei numerischen Berechnungen passiert? Versuchen Sie zum Beispiel sqrt(3)^2-3: Das Ergebnis ist nicht genau Null. Kann das auch mit einem unären Minus passieren? Ist es verlustbehaftet wie Quadratwurzel ist?

Ein anderer Weg, um die Frage zu stellen wäre: ein negativer numerische wörtliche immer gleich negiert sein positives Gegenstück?

Meine Frage bezieht sich auf Matlab, aber wahrscheinlich hat mehr mit dem IEEE-754-Standard als mit Matlab speziell zu tun.

Ich habe einige Tests in Matlab mit einigen zufällig ausgewählten Zahlen durchgeführt. Ich habe festgestellt, dass in diesen Fällen,

  • Sie entpuppen sich als gleich in der Tat.
  • typecast(x, 'uint8')typecast(-x, 'uint8') und unterscheiden sich nur in dem Vorzeichenbit wie durch IEEE 754 double-precision format definiert.

Dies deutet darauf hin, dass die Antwort bejahend sein kann. Wenn das unäre Minus nur das Vorzeichenbit und nicht den Signifikanden ändert, geht keine Genauigkeit verloren.

Aber natürlich habe ich nur wenige Fälle getestet. Ich möchte sicher sein, dass dies in allen Fällen passiert.

+0

Es scheint, wie dies auf dem [Rundungsmodus] abhängen könnte (https://en.wikipedia.org/wiki/Floating_point#Rounding_modes). Interessieren Sie sich für Ganzzahlen in bestimmten oder beliebigen Fließkommawerten? – horchler

+0

@horchler Beliebige Fließkommawerte. Ja, ich denke, dass das Runden auf Null notwendig wäre, um die Antwort zu bestätigen. Ist bekannt, welchen Rundungsmodus Matlab verwendet? –

+0

Weiß nicht. Der Standardrundungsmodus für IEEE-754 ist ["symmetrisch"] (https://en.wikipedia.org/wiki/Rounding#Round_half_to_even). Ich nehme an, dass es das verwendet, obwohl es auch systemabhängig sein kann. – horchler

Antwort

1

Diese Frage hängt von der Computerarchitektur ab. Das Vorzeichen von Fließkommazahlen auf modernen Architekturen (einschließlich x64- und ARM-Kernen) wird jedoch durch ein einzelnes Vorzeichenbit dargestellt, und sie haben Anweisungen zum Umkehren dieses Bits (z. B. FCHS). Wenn das der Fall, können wir zwei Schlüsse ziehen:

  1. Ein Vorzeichenwechsel erreicht werden kann (und indeed is by modern compilers und Architekturen) durch ein einzelnes Bit-Flip/Anweisung. Dies bedeutet, dass der Prozess vollständig invertierbar ist und keine numerische Genauigkeit verloren geht.
  2. Es würde für MATLAB keinen Sinn machen, etwas anderes als das schnellste und genaueste zu tun, was nur darin besteht, dieses Bit umzudrehen.

Das heißt, der einzige Weg, um sicher zu sein wäre, den Assembler-Code für uminus in MATLAB-Installation zu überprüfen. Ich weiß nicht, wie ich das machen soll.