AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein IEEE 754 Gleitkommazahl in Real-Zahl wandeln
Thema durchsuchen
Ansicht
Themen-Optionen

IEEE 754 Gleitkommazahl in Real-Zahl wandeln

Ein Thema von oki · begonnen am 4. Sep 2008 · letzter Beitrag vom 4. Sep 2008
Antwort Antwort
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#1

IEEE 754 Gleitkommazahl in Real-Zahl wandeln

  Alt 4. Sep 2008, 18:05
Hi Leute,

ich glaub, hier fehlen mir ein paar Grundlagen. Folgende Aufgabenstellung.

Ich bekomme eine Gleitkommazahl im IEEE 754 Format (42 5a db d7).
Diese soll nach dem IEEE 754 Standard in einen Realwert gewandelt werden. Dieser sollte für den Wert "42 5a db d7" die Zahl 54.714687 ergeben.

An dieser Stelle ist der Standard recht gut erklärt IEEE 754.

Ich komme genau bis zu der Stelle, an der die Umwandlung der Nachkommastellen vorgenommen wird
Zitat:
Nachkommastellen:
0,0110011001100110011 (2) ≈ 0.39999961853 (10)
Weil die 0,4 im binären eine periodische Darstellung hat, kann sie nicht mehr genau umgewandelt werden
Wie wandel ich die Binärzahl in den Wert 0.399.. um? Das Thema mit dem Komma habe ich nicht begriffen. Eigentlich muss ich ja den Nachkommaanteil berechnen, der in meinem Fall 0,714687 ist.

Hier mein Code bis zur Berechnung des Nachkommaanteils. Da ist dann ein Lücke
Delphi-Quellcode:
function TDataRecord_07.IEEE745toFloat(Value: Integer): Real;
var
  Sign: Boolean; // True = Vorzeichen (-); False = kein Vorzeichen (+)
  Bias : Integer;
  Exponent: Integer;
  Mantisse: Integer;
  IntValue : Integer; // Vorkommastellen
  FracValue : Integer; // Nachkommastellen
begin
  Sign := (Value and $80000000) = $80000000;
  // da wir hier ausschließlich 32 Bit-Werte umrechnen wird ein fester Bias von 127 benutzt
  Bias := 127;
  Exponent := Value shl 1;
  Exponent := Exponent shr 24 - Bias;
  Mantisse := Value and $7FFFFF;
  // Hidden-Bit dazu
  Mantisse := Mantisse or $800000;
  // Vorkomma ermitteln
  IntValue := Mantisse shr (23 - Exponent);
  // Nachkomma
  FracValue := Mantisse shr (Exponent + 1);
  FracValue := FracValue shl (Exponent + 1);


  // Result := ;
  if Sign then
    Result := -Result;
end;
Wenn mir da mal einer auf die Sprünge helfen kann?

Dank und Gruß

oki
42
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#2

Re: IEEE 754 Gleitkommazahl in Real-Zahl wandeln

  Alt 4. Sep 2008, 18:14
Was hindert dich daran, deinen Parameter einfach auf Single zu casten und zuzuweisen?

Aber zur Theorie: 0,011 ist 2^-2 + 2^-3 ist 1/4 + 1/8 ist 0,25 + 0,125 ist 0,375.. Falls es das war, was sich dir entzogen hat...
  Mit Zitat antworten Zitat
Benutzerbild von FAlter
FAlter

Registriert seit: 21. Jul 2004
Ort: Ostfildern
1.095 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

Re: IEEE 754 Gleitkommazahl in Real-Zahl wandeln

  Alt 4. Sep 2008, 18:18
Hi,

Delphi wandelt die Gleitkommatypen automatisch ineinander um. Was du meinst ist ein Single:

Delphi-Quellcode:
var
  Data: array[0..3] of byte;
  X: Real;
begin
  //Hier steht jetzt deine Zahl drin:
  Data[3] := $42;
  Data[2] := $5a;
  Data[1] := $db;
  Data[0] := $d7;

  //Interpretiere diese Zahl als Single und wandle sie in einen anderen Gleitkommatyp um
  X := PSingle(@data)^;

  //Anzeigen
  ShowMessage(FloatToStr(X));
end;
Felix Alter
Japanurlaub 2015
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#4

Re: IEEE 754 Gleitkommazahl in Real-Zahl wandeln

  Alt 4. Sep 2008, 18:36
Ähm,

ist mir doch immer wieder peinlich so einfache Grundlagen verpennt zu haben und die naheliegende Lösung nicht zu sehen.
Dann sollte das mit dem casten der einfachste Weg sein. Wer natürlich keine Ahnung hat fand meine Function aber bestimmt beeindruckend

Besten Dank an euch beide, damit komme ich jetzt klar.

Gruß oki
42
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:16 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz