Forum: Mikrocontroller und Digitale Elektronik gleitkommazahl gesucht


von Maddin (Gast)


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

von Ingo E. (ogni42)


Lesenswert?

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

von Karl H. (kbuchegg)


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

von yalu (Gast)


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.

von Obelix (Gast)


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)

von Obelix (Gast)


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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Dirk S. (Gast)


Lesenswert?

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

von Maddin (Gast)


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

von Philipp B. (philipp_burch)


Lesenswert?

[...]
> 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
Noch kein Account? Hier anmelden.