double array zu float array
-
Hallo,
ich habe ein double Array: double d[3];
und eine Funktion, die ein float array erwartet: void foo(float f[3);
Wie uebergebe ich das array d jetzt an foo? ein foo(d) geht nicht. Wieso geht nicht foo( static_cast<float*>(d) )?
-
Float und double haben unterschiedliche Größen, daher sind auch Pointer da drauf total inkompatibel, weshalb die der Compiler zurecht vor solch einem static_cast bewahrt. Selbst wenn du ihn mit einem reinterpret_cast zwingen würdest, würde das falsche herauskommen.
Abhilfe:
Mach so etwas gar nicht erst. Wieso benutzt du rohe Arrays? Wieso mischt du unterschiedliche Fließkommatypen? Dein Programm wäre in jedweder Hinsicht besser, würdest du dies nicht tun.
-
caster2 schrieb:
Wieso geht nicht foo( static_cast<float*>(d) )?
Weil d nunmal kein float-Array ist. Wenn das gehen würde (mit reinterpret_cast kannst du den Compiler dazu kriegen), wäre der Code trotzdem nicht sinnvoll, weil dann auf das double-Array zugegriffen würde, als ob es ein float-Array wäre. Also z.b. würde das erste double-Element als zwei float-Elemente interpretiert.
Dir bleibt nichts anderes übrig, als das Array Element für Element in ein neues float-Array umzukopieren und dieses zu übergeben.
-
Ja, das leuchtet ein. Was ich dann jedoch nicht verstehe ist, wieso dieser Code ohne Fehler und sogar ohne Warnings kompiliert:
osg::Vec3 p; Vertex(double pos[3]) : p(pos[0], pos[1], pos[2]),
Der Ctor von Vec3 sieht so aus: Vec3::Vec3(float x, float y, float z). Wieso klappt das, obwohl ich ihm doch 3 double uebergebe?
-
Die doubles werden in float konvertiert.
-
Bashar schrieb:
Die doubles werden in float konvertiert.
Schon klar, aber float ist ja kleiner als double. Sollte es nicht mindestens ein Warning geben? Benutze g++ und hab sogar -Wall an
-
caster2 schrieb:
Bashar schrieb:
Die doubles werden in float konvertiert.
Schon klar, aber float ist ja kleiner als double. Sollte es nicht mindestens ein Warning geben? Benutze g++ und hab sogar -Wall an
Und was sollte diese Warnung sagen? Es passiert doch nichts gefährliches.
Bevor jetzt was vonwegen dem Wertebereich kommt: Die maximalen Werte von double und float sind bei fast allen Implementierungen gleich (nämlich unendlich). Der Unterschied ist die Genauigkeit.
-
SeppJ schrieb:
caster2 schrieb:
Bashar schrieb:
Die doubles werden in float konvertiert.
Schon klar, aber float ist ja kleiner als double. Sollte es nicht mindestens ein Warning geben? Benutze g++ und hab sogar -Wall an
Und was sollte diese Warnung sagen? Es passiert doch nichts gefährliches.
Bevor jetzt was vonwegen dem Wertebereich kommt: Die maximalen Werte von double und float sind bei fast allen Implementierungen gleich (nämlich unendlich). Der Unterschied ist die Genauigkeit.
Also bei mir kommt 'ne Warnung nach dem Gusto "warning: loss of precision possible"