(Sprich: Man muss nur eine Multiplikation über positiven Zahlen definieren und kann diese sehr leicht auf negative Zahlen erweitern, indem man die ersten Bits und die letzten Bits separat multipliziert – genau wie man mit Dezimalzahlen rechnen kann:
So funktioniert leider die Addition überhaupt nicht gut:
-1 + 1 = 1001 + 0001 = ??? = 0000
Da müsste man Umwege gehen, damit das richtig klappt. Ein für positive Zahlen definiertes Plus kann man nicht einfach auf negative Zahlen erweitern.
Da aber Additionen sehr viel häufiger vorkommen als Multiplikationen, will man diese effizienter und ohne aufwändige Umwandlungen haben.
Die Lösung:
Als Beispiel:
Die Gleichung -1 + 1 = 0 sollte mit klassischer Addition funktionieren:
Also muss gelten:
-1 + 0001 = 0000
Der einzige Wert, der für -1 das erfüllt wäre also 1111. Denn 1111 + 0001 = 10000 – aber die vorderste 1 geht ja verloren, denn wir speichern nur die hintersten 4 Bits ab. Also ist 1111 + 0001 = 0000.
Um von einer beliebigen Zahl X auf ihr Negatives -X zu kommen, muss man erst alle Bits invertieren und dann +1 rechnen.
Laut IEEE-Standard ist -0 gleich +0 beim Vergleich, auch wenn es sich in manchen anderen Operationen anders verhält als +0. Damit ist es doch nichtnegativ.
Ich verstehe nicht, was die Existenz neutraler Zahlen damit zu tun hat.
Rein semantisch, weil +0 und -0 beide existieren, würde ich -0 als negative Zahl betrachten. In gewöhnlichen Zahlensystemen ist sonst ja 0 eine neutrale Zahl (also nichtnegativ und nichtpositiv), auch wenn einfachkeitshalber das “+” bei der Darstellung positiver Zahlen weggelassen wird.
Sorry, nein, die Begriffe negativ und nichtnegativ sind klar definiert und beziehen sich darauf ob eine Zahl kleiner 0 oder größer gleich 0 ist. Wegen -0==0 ist -0 damit nichtnegativ.
std::signbit ist ein interessanter Punkt, ich würde vermuten, dass diese Funktion, wie der Name suggeriert, nur das sign bit bestimmen soll, und dass beim Verfassen der Doku nicht darüber nachgedacht wurde, ob die Bezeichnung “negativ” auch auf den Sonderfall -0 zutrifft.
Wenn wir ganz penibel sind, so steht -0.0 nicht für eine einzige Zahl, sondern für alle Zahlen kleiner als minus minFloat und größer gleich 0. Schließlich lassen diese sich nicht repräsentieren, weshalb -0.0 ein Enum auf die Menge der Zahlen (–minFloat, 0] ist. Anders ausgedrückt: -0.0 hat dieselbe Bedeutung wie die Farbe “Rot” als Enum.
Der Erwartungswert des Vorzeichens einer zufälligen Zahl aus dieser Menge ist negativ (da alle, bis auf endlich viele Zahlen negativ sind). Daher ist -0.0 eindeutig negativ.
1000 mal gelesen und gehört,
1001 mal ignoriert
Wieso hast du es 8 mal gelesen/gehört und 9 mal ignoriert?
Erklärung
In binär ist 1000 = 8 und 1001 = 9.
Nur für ungesignte Zahlen, wenn’s gesigned ist ist es -8 und -7 🤓
Und wenn’s FP4 ist, dann ist es auch irgendwas im negativen Bereich.
Wäre es nicht stattdessen “-0” und -1 ?
Das ist auch eine Möglichkeit, wenn auch eine sehr seltene.
Denn während die Multiplikation mit dieser Darstellung super funktioniert:
-2 * 2 = 1010 * 0010 = (1 * 0) || (010 * 010) = 1 || 100 = 1100 = -4
(Sprich: Man muss nur eine Multiplikation über positiven Zahlen definieren und kann diese sehr leicht auf negative Zahlen erweitern, indem man die ersten Bits und die letzten Bits separat multipliziert – genau wie man mit Dezimalzahlen rechnen kann:
-5 * 6 = (-1 * 5) * (1 * 6) = (-1 * 1) * (5 * 6) = (-1) * 30 = -30
So funktioniert leider die Addition überhaupt nicht gut:
-1 + 1 = 1001 + 0001 = ??? = 0000
Da müsste man Umwege gehen, damit das richtig klappt. Ein für positive Zahlen definiertes Plus kann man nicht einfach auf negative Zahlen erweitern.
Da aber Additionen sehr viel häufiger vorkommen als Multiplikationen, will man diese effizienter und ohne aufwändige Umwandlungen haben.
Die Lösung:
Als Beispiel:
Die Gleichung -1 + 1 = 0 sollte mit klassischer Addition funktionieren:
Also muss gelten:
-1 + 0001 = 0000
Der einzige Wert, der für -1 das erfüllt wäre also 1111. Denn 1111 + 0001 = 10000 – aber die vorderste 1 geht ja verloren, denn wir speichern nur die hintersten 4 Bits ab. Also ist 1111 + 0001 = 0000.
Um von einer beliebigen Zahl X auf ihr Negatives -X zu kommen, muss man erst alle Bits invertieren und dann +1 rechnen.
Beispiel:
2 = 0010
-2 = 1101 + 1 = 1110
Mehr dazu unter https://de.m.wikipedia.org/wiki/Zweierkomplement
Für die Zahlen 1000 und 1001 gilt also:
X = 1001 => -X = 0110 + 1 // Invertieren und +1 rechnen => -X = 0111 = 7 => X = -7
Für 1000 klappt das Invertieren und +1 rechnen aber nicht:
X = 1000 => -X = 0111 + 1 => -X = 1000 = X
Aber da folgendes gilt:
X + 1 = 1000 + 1 = 1001 = -7 // siehe oben => X = -8
Das Invertieren und +1 rechnen klappt nicht, da es keine +8 gibt – denn +8 müsste ja “1000” sein, aber Zahlen mit 1 vorne sind negativ.
Ich hoffe, dieser halbe Aufsatz war zumindest halbwegs verständlich.
Genau genommen wäre 1000 in FP4 im nichtnegativen Bereich 🤓🤓
Seit wann ist -0 nichtnegativ? Neutrale Zahlen gibts bei Gleitkommazahlen doch nicht.
Laut IEEE-Standard ist -0 gleich +0 beim Vergleich, auch wenn es sich in manchen anderen Operationen anders verhält als +0. Damit ist es doch nichtnegativ.
Ich verstehe nicht, was die Existenz neutraler Zahlen damit zu tun hat.
Rein semantisch, weil +0 und -0 beide existieren, würde ich -0 als negative Zahl betrachten. In gewöhnlichen Zahlensystemen ist sonst ja 0 eine neutrale Zahl (also nichtnegativ und nichtpositiv), auch wenn einfachkeitshalber das “+” bei der Darstellung positiver Zahlen weggelassen wird.
Außerdem sagt die C++ signbit Funktion:
Also muss ich ja Recht haben, da C++ die einzig wahre Programmiersprache ist.
Sorry, nein, die Begriffe negativ und nichtnegativ sind klar definiert und beziehen sich darauf ob eine Zahl kleiner 0 oder größer gleich 0 ist. Wegen -0==0 ist -0 damit nichtnegativ.
std::signbit ist ein interessanter Punkt, ich würde vermuten, dass diese Funktion, wie der Name suggeriert, nur das sign bit bestimmen soll, und dass beim Verfassen der Doku nicht darüber nachgedacht wurde, ob die Bezeichnung “negativ” auch auf den Sonderfall -0 zutrifft.
🤓🤓🤓
Wenn wir ganz penibel sind, so steht -0.0 nicht für eine einzige Zahl, sondern für alle Zahlen kleiner als minus minFloat und größer gleich 0. Schließlich lassen diese sich nicht repräsentieren, weshalb -0.0 ein Enum auf die Menge der Zahlen (–minFloat, 0] ist. Anders ausgedrückt: -0.0 hat dieselbe Bedeutung wie die Farbe “Rot” als Enum.
Der Erwartungswert des Vorzeichens einer zufälligen Zahl aus dieser Menge ist negativ (da alle, bis auf endlich viele Zahlen negativ sind). Daher ist -0.0 eindeutig negativ.
Da hat’s wohl nicht zooooom gemacht?