gleitkommazahl gesucht

Gast #581020
Lesenswert?

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
#581052
Lesenswert?

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
Gast #581057
Lesenswert?

> 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.
Gast #581146
Lesenswert?

@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)
Gast #581152
Lesenswert?

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.
Gast #581871
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren