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) )?


  • Mod

    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


  • Mod

    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"


Log in to reply