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
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 
Danke @ beiden!
Ja ist mir auch gerade aufgefallen,aber na ja,ein Anfänger darf das
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
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 
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
). 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“