Casting-definition in Standard C++



  • Hallo,
    ich frage mich, warum folgendes automatisch als int gecastet wird. Dazu mal ein rekursiver Algo zur Berechnung der Harmonischen Reihe:

    double hr(double n)
    {
    	if(n==1)
    		return 1;
    	if(n==0)
    		return -1;
    	return (1/n)+hr(n-1);
    }
    

    (das -1 mal als Fehlercode betrachten)
    So!
    Deklariere ich die Funktion allerdings mit (int) als Parameter, ergo:

    double hr(int n) {...}
    

    castet der Spaßvogel den Bruch (1/n) ebenfalls in int.
    Nur warum?
    Prinzipiel macht diese Reihe hauptsächlich Sinn für nNn \in{N},
    warum also double/float als Parameter??? 😕
    Thx für Aufklärung 🙂



  • Wenn eine Division aus ints besteht, macht er halt nur ganzzahlige Division.



  • du mußt ihn davon überzeugen, daß er mit double rechnen soll - und das macht C(++) nur, wenn auch doubles verwendet werden:

    return (1.0/n)+hr(n-1);
    

    (btw, das "res=" in der Rückgabeanweisung ist falsch und sinnlos)



  • blubs, ja das is cpy&paste, war aus einer alten version, schon weggemacht.
    trotzdem ist das doch sehr komisch. ich meine, mich stört, dass in der definition ein bruch nicht automatisch in ein float/double gecastet wird.
    is mir schon klar, dass ichs explizit angeben muss, aber gerade dass nervt mich halt 🙂



  • Das liegt daran, daß unter bestimmten Umständen auch die ganzzahlige Division (plus Modulo-Rechnung) gebraucht wird - und zwar häufiger als die gebrochene Division. Und da der Compiler eine überladene Funktion nicht nach Rückgabetyp auswählen kann, kann er nicht unterscheiden zwischen "double operator/(int x,int y);" und "int operator/(int x,int y);" - deswegen gibt es nur den letzteren.



  • ethereal schrieb:

    ich frage mich, warum folgendes automatisch als int gecastet wird.

    Verstehe nicht ganz was du meinst. Was wird denn als int "gecastet"?

    ethereal schrieb:

    Deklariere ich die Funktion allerdings mit (int) als Parameter, ergo:

    double hr(int n) {...}
    

    castet der Spaßvogel den Bruch (1/n) ebenfalls in int.
    Nur warum?

    Nun, wie bereits gesagt wurde, ergibt int / int = int. Alles andere macht aus C++ Sicht, wegen der strikten Typisierung, auch keinen Sinn.



  • ja das isses eben.
    er kann doch davon ausgehen, dass ein bruch eine dezialzahl wird, auch wenn mal eine ganze zahl rauskommen sollte.
    aber das der bruch dann auch ein int ist, ist doch eigentlich schon ein spezialfall.
    ich meine, in der mathematik geht man auch davon aus, dass ein bruch eine rationale zahl ist und nachkommastellen haben kann.
    man vereinbart ja auch nicht, dass er definition ein bruch immer die gerundete ganzzahl gibt.
    mir ist schon klar, wegen strikter Typisierung muss ein int rauskommen.
    aber ich fänd schöner, wenn int/int = double und wenn man halt doch ne ganzzahl haben ma, dann wirds in ein int gecastet 🙂



  • ethereal schrieb:

    ich meine, in der mathematik geht man auch davon aus, dass ein bruch eine rationale zahl ist und nachkommastellen haben kann.

    Der operator/ ist kein Bruchstrich.

    aber ich fänd schöner, wenn int/int = double und wenn man halt doch ne ganzzahl haben ma, dann wirds in ein int gecastet 🙂

    Zum Glück geht's nicht danach, was du schöner findest. Ich fände es nicht so toll, wenn mit meinen ints eine langsame und potentiell ungenaue Fließkommadivision gemacht wird und ich noch zusätzlichen Aufwand betreiben muss, um daraus wieder einen int zu machen.

    Möchtest du etwa auch, dass bei unsigned int - unsigned int das Ergebnis signed ist? Könnte ja eine negative Zahl dabei herauskommen 😉

    Mach einfach einen der Operanden zu double und du hast deine Fließkommadivision.



  • ja is ja alles kein problem 🙂
    ich habe halt nur mal etwas genörgelt... 😉


Anmelden zum Antworten