mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik gleitkommazahl gesucht


Autor: Maddin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ingo Elsen (ogni42)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Obelix (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Obelix (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Dirk S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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".

Autor: Maddin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Philipp Burch (philipp_burch)
Datum:

Bewertung
0 lesenswert
nicht 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...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.