Umwandlung byte-array in double - c
Ich versuche, das numerisch (double) Wert aus einem byte-array mit 16 Elementen, wie folgt:
unsigned char input[16];
double output;
...
double a = input[0];
distance = a;
for (i=1;i<16;i++){
a = input[i] << 8*i;
output += a;
}
aber es funktioniert nicht.
Es scheint, dass die temporäre variable, die das Ergebnis enthält von Links-shift speichern können nur 32 bits, weil nach 4 Schichtbetrieb von 8 bits, es überläuft.
Weiß ich, dass ich so etwas wie
a = input[i] * pow(2,8*i);
aber, für die Neugier, ich Frage mich, ob es irgendeine Lösung für dieses problem mit Hilfe der shift-operator...
- Sie haben nicht gesagt, was "input[16]" ist darzustellen versuchen. Ist es eine 128-bit-integral-Wert, oder etwas anderes?
- Speichern Sie die Nummer in "input" in form einer 128-bit unsigned integer?
- aus seinen Algorithmus es scheint, dass die Zeichen, die Koeffizienten in einer 15-Ter Ordnung Polynom (mit Basis 256). (@paolo_, ist das richtig?)
- wie sagte Adrian P., der Eingang[16] ein Vektor ist eine Folge von bits, die will ich darstellen, wie eine 128-bit-Ganzzahl ohne Vorzeichen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Edit: das funktioniert nicht (siehe Kommentar), ohne so etwas wie
__int128
.Den Ausdruck
input[i]
wird gefördertint
(6.3.1.1) , die 32bit auf Ihrem Rechner. Um dieses Problem zu beheben, der linke operand zu 64bit, wie inoder
und denken Sie daran, über endianness
Hier das problem, dass in der Tat die 32-bit-Variablen können nicht verschoben werden, die mehr als 4*8-mal, d.h. Ihr code funktioniert für 4 char ' s nur.
Was Sie tun können, finden Sie die ersten wichtigen char und verwenden Horner ' s law: anxn + an-1n-1 + ... = ((...( an - x + an-1 ).x + an-2 ) . x + ... ) + a0, wie folgt:
Kurz gesagt, Nein, Sie können nicht konvertiert eine Sequenz von
byte
s direkt in einedouble
durch bit-Verschiebung, wie gezeigt, durch Ihre code-Beispiel.byte
, einen integer-Typ und diedouble
, eine floating-point-Typ (D. H. nicht-Ganzzahl-Typ) sind nicht bitweise kompatibel (d.h. man kann nicht einfach bitshift um Werte von einem Haufen von bytes in eine floating-point-Typ und erwarten, dass ein gleichwertiges Ergebnis.)1) Vorausgesetzt, das byte-array ist ein Speicherpuffer, der auf einen integer-Wert, sollten Sie in der Lage, konvertieren Sie Ihre
byte
- array in eine 128-bit-Ganzzahl, die mittels bit-shifting und dann zu konvertieren, dass die resultierende Ganzzahl in einedouble
. Vergessen Sie nicht, dass endian-Problemen kommen kann in spielen abhängig von der CPU-Architektur.2) Vorausgesetzt, das byte-array ist ein Speicher-Puffer, enthält eine 128-bit-long double-Wert, und vorausgesetzt, es gibt keine endian Probleme, Sie sollten in der Lage sein zu memcpy den Wert aus dem byte-array in die long double-Wert
Warum nicht einfach werfen, dass das array ein double-pointer?
wenn Sie ein Problem lösen müssen endian-ness, reverse-char-array mit der STL reverse() vor der Umwandlung in ein double array.
Haben Sie versucht, std::atof:
http://www.cplusplus.com/reference/clibrary/cstdlib/atof/
Sind Sie versuchen, zu konvertieren einen string-Darstellung einer Zahl in eine reelle Zahl? In diesem Fall, die C-standard-atof ist dein bester Freund.
Sowie auf der Grundlage der Rangfolge der rechten Seite des
wird ausgewertet, bevor es umgewandelt wird, um eine doppelte, so sind Sie Verschiebung-Eingang[i] von 8*i-bits, welche das Ergebnis in eine 32-bit-temporäre variable und somit überläuft. Sie können versuchen, die folgenden:
Edit: Nicht sicher, was die Größe von einer Doppel-auf Ihrem system, aber nach meinem es ist 8 bytes, wenn dies der Fall ist, auch für Sie die zweite Hälfte Ihrer Eingabe-array wird nie gesehen, wie die shift-überlauf wird sogar die double-Typ.