Funktion spuckt immer komischen Wert aus

Hallo,

ich habe ne kurze Frage und zwar habe folgende Funktion:

double Ergebnis (float a,float b)

{
float Summe;
Summe = (a+b);

}

Wenn ich jetzt

Ergebnis (4,5)

mache, also Werte einsetze, dann kommt als Ergebnis: 1.#QNAN

Und das immer :confused: egal welche Werte ich einsetze.

Was soll mir das sagen? Soll das eine Zahl darstellen?

Hallo,

ist nur ein kleiner Fehler, aus:

double Ergebnis (float a,float b)

{
float Summe;
Summe = (a+b);

}

wird:

 double Ergebnis (float a, float b) {
 float Summe = a + b;
**return Summe** ;
 }

GrĂŒeße

CMБ

aber wieso die Variable „Summe“ als float initialisieren wenn doch die Funktion ein double zurĂŒckgeben soll? Der cast erschließt sich mir nicht ganz 
 also entweder die Funktion

 float Ergebnis

oder die Summe auch als double initialisieren. Ändert zwar an der Funktionsweise nichts, aber ich wollts einfach mal anmerken :wink:

Danke @ beiden!

Ja ist mir auch gerade aufgefallen,aber na ja,ein AnfÀnger darf das :stuck_out_tongue: Aus Fehlern lernt man ja nur.

na klaro
 Wie gesagt, is eigentlich kein fehler, aber kann bei grĂ¶ĂŸeren projekten dann fĂŒr verwirrung sorgen :wink: viel erfolg beim weiteren programmieren

Hallo Fragewurm,

Die Lösung hast du ja jetzt.

mache, also Werte einsetze, dann kommt als Ergebnis:
1.#QNAN
Was soll mir das sagen? Soll das eine Zahl darstellen?

Nö, ganz im Gegenteil!
Das zeigt dir, dass das Resultat keine gĂŒltige Nummer ist.

Übrigens solltest du beim Compiler einmal alle Warnungen einschalten.
Dann hĂ€tte dir der Compiler schon gesagt, dass du vergessen hast einen Wert zurĂŒck zu geben :smile:

MfG Peter(TOO)

Hallo

Sehe ich nicht so. Stell Dir mal vor, Du hast
10 Millionen 3D-GleitkommadatensÀtze. In nahezu
allen FĂ€llen reicht fĂŒr Positionsdaten ein ‚float‘,
durch Skalierung der ‚Welt‘ (Werte hauptsĂ€chlich um 1.0)
kann man fĂŒr ‚float‘ die höchste Genauigkeit herausschinden.

10^6 x 3 x 4 Byte => 120 MByte (float), 240 MByte (double)

Eine Funktion, die z.B. zwei x-Werte miteinander vergleicht,
um das Ergebnis einem (jetzt aber genaueren) Berechnungskernel
zuzufĂŒhren (return) mĂŒĂŸte in etwa so parametrisiert sein,
wie der OP das gemacht hat

 double Ergebnis (float a, float b) {
**float** Summe = a + b;
 /\* hier 100 weitere "schnelle" float-Berechnungen \*/
 return Summe; /\* Konvertierung bei return fĂŒr Ergebnis-
 Akkumulation \*/
 }

Ansonsten wĂ€re es gĂŒnstiger, auch in den formalen Parameter
bereits nach double zu konvertieren, also

 double Ergebnis (double a, double b) {
**double** Summe = a + b;
 return Summe;
 }

so wie Du das oben angemerkt hast.

Wenn man z.B. in CUDA rechnet, sind float-Rechnungen
bis zu 20 mal schneller als double-Rechnungen. Die
von CUDA ausgespuckten Ergebnisse wĂŒrde man dann
in ‚double‘ fĂŒr die Auswertung einsammeln.

Nur als Anmerkung.

GrĂŒĂŸe

CMБ

[Bei dieser Antwort wurde das Vollzitat nachtrÀglich automatisiert entfernt]

ist nur ein kleiner Fehler, aus:

double Ergebnis (float a,float b)

{
float Summe;
Summe = (a+b);

}

wird:

double Ergebnis (float a, float b) {
float Summe = a + b;
return Summe ;
}

GrĂŒeße

CMБ

Hallo nochmal,

ich habe versucht es durch mein Buch zu verstehen, aber ich kapier es immer noch nicht. Warum muss ich einer Funktion bzw. dieser Funktion den Befehl return erteilen? Warum? Ich weiß,dass wenn man es nicht macht, Fehler auftauchen können


Kann mir das jemand erklÀren?

Hallo Keozor !

Wenn eine Funktion ein Ergebnis zurĂŒckliefern soll muss der Compiler wissen welcher Wert das sein soll (die hellseherischen FĂ€higkeiten von Compilern sind zur Zeit nĂ€mlich noch sehr beschrĂ€nkt :wink: ). Dazu ist das Statement ‚return‘ da: es teilt dem Compiler mit dass die Funktion eben diesen angegebenen Wert als Ergebnis zurĂŒckliefern soll.

mfg
Christof

1 Like

Vielen dank! :smile: