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...