signedness

___ tag123languageagnostic ___ Verwenden Sie dieses Tag zum PROGRAMMIEREN VON FRAGEN, die unabhängig von einer bestimmten Programmiersprache sind. ___ tag123floatingpoint ___ Fließkommazahlen sind Näherungen reeller Zahlen, die größere Bereiche als Ganzzahlen darstellen können, aber die gleiche Menge an Speicher verwenden, auf Kosten geringerer Genauigkeit. Wenn es sich bei Ihrer Frage um kleine arithmetische Fehler (z. B. warum 0,2 + 0,1 ist gleich 0,300000001?) Oder um Dezimalwandlungsfehler handelt, lesen Sie bitte die unten verlinkte Seite "info" vor dem Posten. ___ tag123precision ___ Für Fragen zur numerischen Genauigkeit in der Programmierung. ___ tag123ieee754 ___ IEEE 754 ist der Standard des Institute of Electrical and Electronics Engineers für Fließkomma-Berechnungen und ist der am weitesten verbreitete Gleitkomma-Standard. ___ tag123signigness ___ hilf uns dieses Wiki zu bearbeiten ___ answer3600297 ___

Obwohl %code% Ihnen %code% und nicht %code% geben kann, wird %code% genauso groß wie %code% , so dass Sie mit Ihrer Annahme sicher sind, dass jede endliche Zahl minus sich selbst mit Null vergleichen wird .

Siehe Gibt es einen Fließkommawert von x, für den xx == 0 ist falsch? für weitere Details.

    
___ qstntxt ___

Gleitkommawerte sind ungenau, weshalb wir in Vergleichen nur selten strenge numerische Gleichheit verwenden sollten. In Java beispielsweise wird %code% ( wie auf ideone.com ) angezeigt:

%Vor%

Normalerweise ist es der richtige Weg, um Ergebnisse von Gleitkommaberechnungen zu vergleichen, um zu sehen, ob die absolute Differenz gegenüber einem erwarteten Wert geringer ist als die tolerierte Epsilon .

%Vor%

Die Frage ist, ob einige -Operationen genaue Ergebnisse liefern können. Wir wissen, dass für jeden nicht-endlichen Gleitkommawert %code% (dh entweder %code% oder eine Unendlichkeit) %code% IMMER %code% .

Aber wenn %code% endlich ist, ist das garantiert?

  1. %code%
  2. %code%
  

(Ich bin insbesondere an Java-Verhalten interessiert, aber auch Diskussionen für andere Sprachen sind willkommen.)

Für was es wert ist, denke ich (und ich kann hier falsch liegen) ist die Antwort JA! Ich denke, es läuft darauf hinaus, ob für ein endliches IEEE-754 Fließkommazahl, ihre additive Inverse ist immer genau berechenbar. Da z.B. %code% und %code% hat ein dediziertes Bit nur für das Zeichen , dies scheint der Fall zu sein es muss nur das Vorzeichen-Bit umgedreht werden, um das additive Inverse zu finden (dh der significand sollte intakt bleiben).

>

Verwandte Fragen

___ qstnhdr ___ Ist für jeden endlichen Gleitkommawert garantiert, dass x - x == 0? ___ answer3599600 ___

Beide Gleichheiten sind mit Gleitkommazahl IEEE 754 garantiert, da die Ergebnisse von %code% und %code% genau wie Gleitkommazahlen mit der gleichen Genauigkeit wie %code% dargestellt werden können. In diesem Fall müssen die genauen Werte unabhängig vom Rundungsmodus von einer kompatiblen Implementierung zurückgegeben werden.

EDIT: Vergleiche mit dem Beispiel %code% .

Sie können in IEEE 754 %code% und %code% nicht hinzufügen, da Sie sie nicht so darstellen können, dass sie an %code% übergeben werden. Addition, Subtraktion, Multiplikation, Division und Quadratwurzel geben den eindeutigen Gleitkommawert zurück, der, abhängig vom Rundungsmodus, unmittelbar unterhalb, unmittelbar darüber liegt, am nächsten zu einer Regel für die Behandlung von Bindungen, ..., dem Ergebnis der Operation an die gleichen Argumente in R . Wenn das Ergebnis (in R ) zufällig als Fließkommazahl dargestellt werden kann, ist diese Zahl automatisch das Ergebnis, unabhängig vom Rundungsmodus.

Die Tatsache, dass Ihr Compiler Sie %code% als Abkürzung für eine andere, darstellbare Zahl ohne Warnung schreiben kann, ist orthogonal zur Definition dieser Operationen. Wenn Sie beispielsweise %code% schreiben, ist %code% genau: es gibt genau das Gegenteil seines Arguments zurück. Auf der anderen Seite ist das Argument nicht %code% , sondern das %code% , das der Compiler an seiner Stelle verwendet.

Kurz gesagt, ein weiterer Grund, warum die Operation %code% genau ist, ist, dass %code% als %code% dargestellt werden kann.

    
___
1
Antwort

Sollte ich jedes Mal "unsigned" verwenden, wenn ich weiß, dass ich nicht signierte Werte verarbeite?

Oft ist bekannt, dass Werte positiv sind. Zum Beispiel ist die TCP / UDP-Sequenznummer immer ein positiver Wert. Sowohl int als auch unsigned int sind groß genug, um sogar die größte sequence number zu speichern, so dass ich jeden diese...
24.04.2013, 09:34
2
Antworten

Ist für jeden endlichen Gleitkommawert garantiert, dass x - x == 0?

Gleitkommawerte sind ungenau, weshalb wir in Vergleichen nur selten strenge numerische Gleichheit verwenden sollten. In Java beispielsweise wird false ( wie auf ideone.com ) angezeigt: %Vor% Normalerweise ist es der richtige Weg, um Erg...
30.08.2010, 10:35