hallo, ich suche eine gleitkommazahl zwischen 0 und 360, mit zwei nachkommastellen die glatt in einen float passt. hat jemand eine idee wie ich diese finden kann!? ich würde gern feststellen ob und wie viele und welche zahlen zwischen 0,00 und 360,00 überhaupt glatt in einen float passen... dank euch, maddin
Schreib doch einfach ein Programm, dass in eine 32bit Adresse Bitmuster reinschreibt und wandel das nach float (auf Basis des IEEE Formats) dann musst Du nur noch ausfiltern, welche Zahlen exakte zwei Nachkommastellen haben...
Beschränken wir uns mal auf den Bereich 0 .. 1 Eine Floatzahl ist dann nach dem Muster aufgebaut 1 1 1 0 + digit0 * --- + digit1 * --- + digit2 * --- + ... 2 4 8 je nachdem ob digit0, digit1, digit2 etc. 0 oder 1 sind kommt der entsprechende Bruch zum tragen ein binäres 001100100000... entspricht also 1/8 + 1/16 + 1/128 = 0.1953125 woraus im Umkehrschluss geschlossen werden kann, dass 0.1953125 in einem float exakt darstellbar ist. andere Zahlen die logischerweise ebenfalls gehen: 0.5 ( da 1/2) 0.25 ( da 1/4) 0.75 ( da 1/2 + 1/4) 0.125 ( da 1/8) 0.625 ( da 1/2 + 1/8) 0.875 ( da 1/2 + 1/4 + 1/8) Allerdings kommt jetzt noch der Exponent ins Spiel. Dieser ist, wenn ich mich jetzt nicht sehr täusche, eine 2-er Potenz. d.h. bei einem binären Exponenten von 4 (2^4 -> 16) wird aus 0.5 -> 0.5 * 16 = 8 0.25 -> 0.25 * 16 = 4 Aber vorsicht, das ist jetzt nicht mehr eindeutig! Die floating point Zahl 4 kann zb. erreicht werden durch: Basis: 0.25 Exponent: 4 Basis: 0.5 Exponent: 8
> ich suche eine gleitkommazahl zwischen 0 und 360, mit zwei > nachkommastellen die glatt in einen float passt. Das hängt von verwendeten Fließkommaformat ab. Hat dieses die Basis 2, was bei praktisch allen Formaten (auch IEEE) der Fall ist, dann sind diejenigen Brüche exakt darstellbar, deren Nenner nach Kürzung eine Zweierpotenz ist und deren Zähler und Nenner gewisse Grenzen nicht überschreiten. Brüche, deren Nenner eine Zweierpotenz ist und deren Dezimaldarstellung maximal zwei Nachkommastellen hat, haben die Form n, n/2 oder n/4 (n/8 hat schon drei Nachkommastellen) Folglich sind die gesuchten Zahlen 0,00 0,25 0,50 0,75 1,00 1,25 . . . 359,00 359,25 359,50 359,75 360,00 Alle anderen darstellbaren Zahlen in diesem Bereich haben in Dezimaldarstellung mehr als zwei Nachkommastellen.
@Karl Heinz >Aber vorsicht, das ist jetzt nicht mehr eindeutig! Die floating >point Zahl 4 kann zb. erreicht werden durch: Das obererste Bit der Mantisse ist immer gesetzt(virtuell), und kann deswegen weggelassen werden. Ausserdem ist damit auch alles eindeutig, und man spart ein Bit, das man nicht speichern muss, und erhält damit eine höhere Genauigkeit. Der rest wird über den Exponenten geregelt. Dein Beispiel von Oben gibt es also nicht. (Ich kann allertdings nicht sagen, ob es überall so umgesetzt wird)
1,0 = b(1)0000 * 2^1 0,5 = b(1)0000 * 2^0 0,25 = b(1)0000 * -2^1 0,125 = b(1)0000 * -2^2 0,75 = b(1)1000 * 2^0 Bit in Klammern wird nicht mit gespeichert, ist nur viruell. Die Null ist ein Sonderfall und muss speziel kodiert sein.
Obelix wrote: > 1,0 = b(1)0000 * 2^1 > 0,5 = b(1)0000 * 2^0 > 0,25 = b(1)0000 * -2^1 > 0,125 = b(1)0000 * -2^2 > 0,75 = b(1)1000 * 2^0 > > Bit in Klammern wird nicht mit gespeichert, ist nur viruell. Ja richtig, da war doch noch was :-) Dank für die Korrektur.
double float speichert auch diese virtuelle 1. Diese Mehrdeutigkeiten in der Darstellung gibt es sehr wohl. Das läuft unter dem Begriff "Nicht normalisierte Darstellung".
dank an euch alle, ich bin auf das problem gestoßen indem ich einen string, dessen inhalt aus einem winkelwert mit 2 nachkommastellen enthielt, weiterverarbeiten wollte. @yalu, das klingt logisch - hätte ich auch selbst drauf kommen können. ich wunderte und wundere mich noch immer darüber das die ausgabe des gewandelten floats mit einem printf als float dazu führt, das ich zahlen bekomme wie: 352,039999 anstatt 352,04 ich jedoch bei einer ausgabe als double wirklich nur 2 nachkommastellen bekomme, und das obwohl keine formatierung in der ausgabe mit angegeben wurde. es kann doch nicht sein, das z.B. die Zahl 342,67 genau in einen double passt, aber nicht in einen float - oder!? maddin
[...] > es kann doch nicht sein, das z.B. die Zahl 342,67 genau in einen double > passt, aber nicht in einen float - oder!? Warum nicht? Der Double wurde ja eben dazu eingeführt, eine höhere Genauigkeit zu ermöglichen...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.