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 „Gefällt mir“

Vielen dank! :smile: