Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

the[V]oid

Alter Hase

  • »the[V]oid« ist der Autor dieses Themas

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

1

03.08.2008, 22:26

[Erledigt] C/C++ Double Initialisierung

Hallo,

wie initialisiere ich einen double am Besten mit diesem hexadezimal dargestellten Bitmuster:

Quellcode

1
3E 10 00 00 00 00 00 00


Derzeit löse ich das so:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
double build_double ( char b7, char b6, char b5, char b4, char b3, char b2, char b1, char b0 ) {
    union udouble {
        double d;
        char b [ sizeof ( double ) ];
    } u;
    u.b [ 0 ] = b0;
    u.b [ 1 ] = b1;
    u.b [ 2 ] = b2;
    u.b [ 3 ] = b3;
    u.b [ 4 ] = b4;
    u.b [ 5 ] = b5;
    u.b [ 6 ] = b6;
    u.b [ 7 ] = b7;
    return u.d;
}

const double d = build_double ( 0x3E, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 );

Das ist ja nicht wirklich schön. Ich dachte, es müsste eigentlich irgendwie über einen reinterpret_cast gehen, aber ich kriege es nicht hin.


PS. kleine Frage: Der dargestellte Wert entspricht doch 2^-30, oder täusche ich mich? :?:
<< an dieser Stelle ist eine Signatur verstorben >>

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

03.08.2008, 22:36

C-/C++-Quelltext

1
2
unsigned long long int i = 0x3E10000000000000ULL;
double d = *reinterpret_cast<double*>(&i);

the[V]oid

Alter Hase

  • »the[V]oid« ist der Autor dieses Themas

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

3

03.08.2008, 23:06

Zitat von »"David Scherfgen"«

C-/C++-Quelltext

1
2
unsigned long long int i = 0x3E10000000000000UL;
double d = *reinterpret_cast<double*>(&i);


Geht nicht.

Quellcode

1
const unsigned long long int n = 0x3E10000000000000UL;
gibt mir einen

Quellcode

1
Ganzzahlkonstante ist zu groß für »unsigned long«-Typ
<< an dieser Stelle ist eine Signatur verstorben >>

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

03.08.2008, 23:10

Ups, hatte das zweite L vergessen.
Habe mein Posting editiert. Jetzt sollte es gehen.

BlackSnake

Community-Fossil

Beiträge: 1 549

Beruf: Student

  • Private Nachricht senden

5

03.08.2008, 23:17

Zitat von »"David Scherfgen"«

C-/C++-Quelltext

1
2
unsigned long long int i = 0x3E10000000000000ULL;
double d = *reinterpret_cast<double*>(&i);

dieses ULL benötigts du nur, wenn du mit dem g++ compiler arbeitest. bei de c++ von vs sollte es ohne gehen.

EDIT:
kannst auch _int64 nehmen

the[V]oid

Alter Hase

  • »the[V]oid« ist der Autor dieses Themas

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

6

03.08.2008, 23:55

Danke. Warum geht eigentlich einfach nur

C-/C++-Quelltext

1
double d = reinterpret_cast<double>(0x3E10000000000000ULL)
nicht?

Zitat von »"BlackSnake"«

dieses ULL benötigts du nur, wenn du mit dem g++ compiler arbeitest. bei de c++ von vs sollte es ohne gehen.


Dieses ULL ist meines Wissens nach aber Standard und sollte deshalb auch immer verwendet werden. Dass der MS-Compiler nicht gerade alle Standards einhält, ist ja nix neues.
<< an dieser Stelle ist eine Signatur verstorben >>

p0llux

Treue Seele

Beiträge: 101

Wohnort: Aachen

Beruf: HiWi (theo. Inf.)

  • Private Nachricht senden

7

04.08.2008, 02:26

Der Reinterpret-Cast interpretiert das Objekt quasi neu, dass du castest. Allerdings gibt es "keinen Sinn" eine Ganzzahl als Fliesskommazahl zu interpretieren, weil jeweils die Bitmuster total anders ausgelegt werden.

Der von David beschriebene Umweg funktioniert, weil du hier einen Zeiger castest, also den Typ der referenzierten Variable. Weil Zeiger im Prinzip auch nur Integer-Werte sind, kann man Zeigertypen beliebig austauschen.

Also: Theoretisch ist ein solcher Cast direkt machbar, aber ich vermute, dass er nicht erlaubt ist um "dumme Fehler" zu verhindern.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

04.08.2008, 17:12

Zitat von »"the[V«

oid"]Dieses ULL ist meines Wissens nach aber Standard und sollte deshalb auch immer verwendet werden. Dass der MS-Compiler nicht gerade alle Standards einhält, ist ja nix neues.


nein, es ist eine erweiterung. der standard kennt (noch) kein long long.
der ms compiler setzt den standard eigentlich schon ganz gut um...

Werbeanzeige