Convert floating-Zahl binäre Darstellung Programm in C
#include "ieee754.h"
#include <stdio.h>
#include <math.h>
//This program convert a floating number to its binary representation (IEEE754) in computer memory
int main() {
long double f, binaryTotal, binaryFrac = 0.0, frac, fracFractor = 0.1;
long int integer, binaryInt = 0;
long int p = 0, rem, temp;
printf("\nEnter floating number: ");
scanf("%Lf", &f);
//separate the integer part from the input floating number
integer = (int)f;
//separate the fractional part from the input floating number
frac = f - integer;
//loop to convert integer part to binary
while (integer != 0) {
rem = integer % 2;
binaryInt = binaryInt + rem *pow(10, p);
integer = integer / 2;
p++;
}
//loop to convert fractional part to binary
while (frac != 0) {
frac = frac * 2;
temp = frac;
binaryFrac = binaryFrac + fracFractor * temp;
if (temp == 1)
frac = frac - temp;
fracFractor = fracFractor / 10;
}
binaryTotal = binaryInt + binaryFrac;
printf("binary equivalent = %Lf\n", binaryTotal);
}
Ich versuche zu konvertieren floating-Zahl binäre Darstellung (64-bit). Dieser code funktioniert, aber nicht perfekt. Zum Beispiel, wenn ich konvertieren .575
es gibt mir 0.100100
aber wenn ich die Konvertierung mithilfe dieser website http://www.exploringbinary.com/floating-point-converter/, die richtige Ausgabe sollte sein 0.1001001100110011001100110011001100110011001100110011
Ich habe Schwierigkeiten zu verstehen, was mein code kürzt die Anzahl. Könnte mir jemand helfen wie man es beheben? Ich Schätze Ihre Hilfe.
- Kompilieren Sie alle Warnungen aktiviert.
- es gibt keine Warnung: ideone.com/aIShip
- Sie sollten schreiben, wie viel Ziffern, die Sie wollen, nachdem die
.
:"%.20Lf"
drucken0.10010011001100110011
. - mch ist richtig, mein Kommentar ist nicht wirklich relevant hier.
- also versuchte ich "%.64Lf" und jetzt gibt mir 0.1001001100110011056694794308319362841075417236424982547760009766 was nicht richtig binäre Zahl. Ich bin nicht sicher, warum ich diese Frage.. könnten Sie das erklären?
- Das ist, weil die Zahl ist nicht exakt darstellbar, im Binär - (oder
double
). So kann es nur drucken, die nächste Zahl, die gespeichert werden können in einerlong double
. Speichern Sie Ihre Zahl in einen string. - meinst du f, binary insgesamt, binäre frac..etc. sollte initialisiert werden, als string?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Viele Probleme:
Mit
(int)
extrahiert den ganzzahligen Teil einerlong double
schränkt die Auswahl. Verwendenmodfl(long double value, long double *iptr);
long p; pow(10,p);
--> Verlust der Präzision inpow()
return-Wert, wennp
übersteigt einen gewissen Wert, (Beispiel 25). Auch seltsam zu verwendenpow()
mit einer Funktion beschäftigtlong double
. Ich würde erwarten, dasspowl()
.Verschiedene andere ungenau FP Probleme:
fracFractor/10
begrenzte Genauigkeit derlong
.Code ist seltsam, wie es versucht, zu konvertieren, eine FP-Zahl (wahrscheinlich einige binary-format) in eine binäre Darstellung. Es sollte nicht verlangen
10
überall im code.Empfehlen etwas einfaches wie
Ausgabe
x
.modfl(lf, addr)
brichtlf
in einen Bruch Teil, der zurückgegeben wird, und eine ganze Anzahl Teil, der gespeichert ist die Adresse diskutiert. Das Ergebnis der Funktion ist eine Bruchzahl, in diesem code, wird es 0,0 oder 0,5 ist. Multiplikation mit 2 macht, 0.0 oder 1.0. Hinzufügen, dass zu'0'
macht'0'
oder'1'
für den Druck. Hoffentlich wird dieser Ansatz ist einfacher als Ihr original. Ich denke nicht, dass es über euer Verständnis hinaus.Hier ist, warum dies unwahrscheinlich ist, zu arbeiten:
0.1 können nicht dargestellt werden passgenau in jede binary floating-point-format. Sie können nicht vertreten 0,1 als ein Vielfaches von negativen Potenzen von zwei. Division durch 10 ist, wird es sammeln Rundungsfehler bei jedem Schritt. Kann es sein, dass Sie diese Schleife, um tatsächlich zu beenden, weil man am Ende nicht den Vergleich zwischen einer Wiederholung Anteil an anderen zu wiederholen Bruchteil.
Und dies wird stark eingeschränkt, was man erreichen kann:
Tun dies in Gleitkomma-gravierende Einschränkungen - und nicht zuletzt, dass die Repräsentation von 0,1 ist nicht darstellbar, wie oben beschrieben. Deshalb erhalten Sie Antworten, erscheinen als eine Mischung aus Binär-und dezimal-stellen.
Um dieses Problem zu lösen, sollten Sie wahrscheinlich Blick auf die einzelnen bits der Zahl. Zu halten, die Allgemeine Idee, Ihre Lösung intakt, das einfachste wird sein, dass die Subtraktion einer negativen Potenz von zwei ist (0.5, 0.25, etc.) aus Ihrer Fraktion, zu testen, ob es ist immer noch positiv, und erstellen Sie eine Zeichenfolge, die Grundlage. Dann verwenden eine ähnliche Logik für den integer-Teil.