was wäre denn die korrekte Methode um eine 64 Bit Floating Point Zahl im
hexadezimalen Format zu initialisieren? Bei meinem C Compiler wird so ein Wert
my_double = 0x1234123412341234 scheinbar als Integer interpretiert und dann
gibt es eine entsprechende Fehlermeldung. Liegt das am Compiler oder wo liegt
der Denkfehler?
Danke und bis dann,
Thorsten
Hi,
ich weiß zar nicht genau, was du willst, aber wie wär's hiermit:
--------
#include <stdio.h>
typedef union
{ double d;
long l[2];
} hexfloat;
int main( void )
{
hexfloat hf;
// hf.d = 3.1415926536;
hf.l[0] = 0x544486E0; hf.l[1] = 0x400921FB;
printf ("%lf", hf.d);
return 0;
}
------
Wichtig ist, dass der Datentyp 'long' bei dir auch wirklich 32-Bit hat (was
aber m.E. fast immer so ist). Unter C++ nimmst du einfach einen longlong
statt des Feldes ...
Tschö
Michael
>was wäre denn die korrekte Methode um eine 64 Bit Floating Point Zahl im
>hexadezimalen Format zu initialisieren? Bei meinem C Compiler wird so ein Wert
>my_double = 0x1234123412341234 scheinbar als Integer interpretiert und dann
>gibt es eine entsprechende Fehlermeldung. Liegt das am Compiler oder wo liegt
>der Denkfehler?
Der korrekte Weg ist beispielsweise
my_double = 100.0;
Durch das Anhängsel .0 zeigst du dem Compiler an, daß es sich bei
der 100 um eine Konstante im Gleitkommaformat handelt.
Es geht auch mit
my_double = 100;
hierbei muß der Compiler eine implizite Typumwandlung von integer
nach double durchführen, was er normalerweise klaglos tut. Im
hexadezimalen Format funktioniert das genauso:
my_double = 0x64; /* 100 (decimal) in hex format */
Natürlich klappt es nur, wenn der Zahlenwert im integer-Format
darstellbar ist, d.h. Werte über 0xFFFFFFFF (etwa 4.2 Milliarden)
funktionieren nicht (32-bit-Integer angenommen).
Dein Beispiel
>my_double = 0x1234123412341234
erfordert eine Integer-Darstellung mit 64 Bit Länge. Wenn du
Glück hast, hat dein Compiler so was eingebaut (z.B. long long
oder int64).
Es gibt auch verschiedene "Bignum"-Bibliotheken, die geschrieben
wurden, um mit sehr großen Zahlen umzugehen. Einige sind als
Sourcecode im Internet zu finden.
Achim
--
Achim Oetringhaus
achim.oe...@gmx.de
Gegenfrage: Warum wollte man sowas tun? Wenn man den genauen Aufbau
eines doubles auf der verwendeten Architektur kennt, löst man das am
elegantesten mit einer
union {
double d;
struct twolongs {
long l1;
long l2;
}
}
Die beiden longs l1 und l2 kannst du dann mit 0x12345679 und 0x90abcdef
initialiseren,
und das ganze als double d betrachten. Oder so ähnlich.
Hope it helps,
- Marcus [www.ohlhaut.de,PGP]
MO> Gegenfrage: Warum wollte man sowas tun?
Sagen wir einmal so: Bei dem verwendeten Compiler beziehungsweise Zielprozessor
(DSP) kann man schon einmal auf die Idee kommen, das so zu machen. ;-)
MO> eines doubles auf der verwendeten Architektur kennt, löst man das am
MO> elegantesten mit einer
Yep, genau so kann man das lösen. Ein freundlicher Mitleser dieser Gruppe hat
mir diesbezüglich per PM auf die Sprünge geholfen. Danke noch einmal für eure
Hilfe.
Bis dann,
Thorsten