Wie genau ist denn nun float?
-
Daniel E. schrieb:
(2) trotzdem größer als einer der beiden Summanden werden kann,
Das hat auch keine behauptet. Bei einem Überlauf ist a+b KLEINER als a.
-
SG1 schrieb:
Daniel E. schrieb:
(2) trotzdem größer als einer der beiden Summanden werden kann,
Das hat auch keine behauptet. Bei einem Überlauf ist a+b KLEINER als a.
Über PowerOffs Geschlecht bin ich nicht informiert, aber das ist genau meine Rede. Ob man ein Carry-Bit abfragt oder (a+b)<a testet ist egal und letzteres ist genormt und damit portabel, was im Widerspruch zu PowerOffs Aussage steht, so wie ich sie verstehe:
Das macht Ausdruecke wie "(a+b)<a" erst recht non-portabel!
-
In meinem Beispiel ging es darum, dass "(a+b)" eben NICHT "<a" ist in einigen Faellen, trotz Ueberlauf, und dass der Ausdruck damit unbrauchbar ist.
Ich habe "(a+b)<a" auch frueher gelegentlich benutzt, bis ich gemerkt habe, dass er eigentlich ueberhaupt nicht funktioniert (nicht in allen Faellen!!).
Dass der Ausdruck "genormt" waere, glaube ich kaum, wenn jemand schon so eine Aussage macht, dann bitte mit Verweis auf die Norm.
-
Power Off schrieb:
In meinem Beispiel ging es darum, dass "(a+b)" eben NICHT "<a" ist in einigen Faellen, trotz Ueberlauf, und dass der Ausdruck damit unbrauchbar ist.
Dann her mit *einem* Beispiel, für das das Resultat falsch wird.
Dass der Ausdruck "genormt" waere, glaube ich kaum, wenn jemand schon so eine Aussage macht, dann bitte mit Verweis auf die Norm.
Das unsigneds wie angegeben funktionieren (also einen Restklassenring modulo UINT_MAX+1 darstellen), steht in 6.2.5#9 und noch an ein paar anderen Stellen. Man kann jetzt mathematisch zeigen, daß a+b, für a,b aus dem Ring (also unsigned) immer kleiner ist, als a und auch kleiner als b.
Beispiel für modulo 5:
+ || 0 | 1 | 2 | 3 | 4 | ------------------------ 0 || 0 | 1 | 2 | 3 | 4 | 1 || 1 | 2 | 3 | 4 | 0*| 2 || 2 | 3 | 4 | 0*| 1*| 3 || 3 | 4 | 0*| 1*| 2*| 4 || 4 | 0*| 1*| 2*| 3*|
Die mit dem * markierten Elemente sind "übergelaufen" und ganz offensichtlich ist die "Summe" in diesen Fällen kleiner als die Summanden. Ist bei unsigned haarscharf genau so.
-
angenommen a ist ein usnigned char mit dem wert 255 und b auch, dann ergibt a+b 254 mit überlauf ... aber ... nur wenn das ergebnis selber ein unsigned char ist.
aber die doofen compiler erweitern ja das ergebnis zu 'nem 'int' so dass a+b 510 ergibt. deshalb haut das (a+b)<a nicht hin. muss noch ein type cast rein.
-
Das Typenkonvertierungen stattfinden ist schon klar, aber dann wird bei a+b für 'unsigned char' wohl kaum ein carry-bit gesetzt und um den Vergleich geht's ja.
(Außerdem hatte ich am Anfang ja extra (c=a+b)<a vorgeschlagen, wobei das c schreibarbeitssparend im Diskussionsverlauf weggefallen ist.)
-
Sorry, ich glaub' ich hab' 'nen Fehler in meiner Firmware -- mein Beispiel war verkehrt!