fehlerhafte Berechnung oder zu doofer Autor ?
-
Hey ! Ich fang grad an mit c++, und hab bei dem simpelsten scheiß meine Probleme. Ich will das Volumen einer Kugel berechnen, Formel ist ja 4\3*Pi*r^3 . Mein Code sieht so aus :
cout<<"Welche geometrische Figur?\n"; cout<<"1 fuer Rechteck\n"; cout<<"2 fuer Kugel\n"; cin>>menu; if(menu==1) { //blablablubb } if (menu==2) { long double r; cout<<"Radius\n"; cin>>r; long double erg=(3.1415*1,3333*r*r*r); cout<<"Das Volumen betraegt "<<erg<<"\n"; menu=0; }Ich habe die Formel in Zeile 14 schon so vereinfacht, dass es nicht mehr so viel Rechenaufwand kostet, aber auch als komplexere Division mit der ursprünglichen 4\3 tritt einfach das Problem aus, dass der Wert, der am Ende herauskommt, vollkommener Quatsch ist : Bei einem Radius von 3 89991 , bei Radius 1 3333 . Ich hatte das schon öfter, dass der einfach ganz simple Berechnungen vollkommen falsch ausführt. Hat jemand eine Ahnung woran das liegt ? Der Rest des Programms klappt einwandfrei (hab hier nur nen Auszug gepostet)
Hoffe ihr könnt mir helfen.
PS : Dass man an einigen Stellen eleganter schreiben kann ist mir schon klar, aber ich hab die ganze Eleganz mal ins simpelste aufgelöst, um den Fehler finden zu können.
-
Das Komma ist das Problem.
-
Oder, um es deutlicher zu machen: C verwendet einen Punkt als Dezimaltrennzeichen.
-
Müsste der Compiler nicht einen Fehler melden? --> Lesen können hat Vorteile

-
DEvent schrieb:
Müsste der Compiler nicht einen Fehler melden? --> Lesen können hat Vorteile

Nein müsste er nicht, warum denn?
-
Bashar schrieb:
DEvent schrieb:
Müsste der Compiler nicht einen Fehler melden? --> Lesen können hat Vorteile

Nein müsste er nicht, warum denn?
long double erg=(3.1415*1,3333*r*r*r);Gibts einen ,-operator?
-
Ja, den gibt es - und der wird an dieser Stelle auch verwendet.
(der Komma-Operator verwirft das Ergebnis des ersten Operanden (Nebeneffekte machen sich bemerkbar) und liefert das Ergebnis des zweiten Operanden zurück - in dem Fall landet also "3.1415*1" auf dem Müll und "3333*r*r*r" wird zurückgegeben)
-
Alternativ zum Ändern des Kommas in einen Punkt könnte man auch einfach den Komma-Operator überladen, um den Fehler zu korrigieren:
#include <cmath> #include <iostream> class Int { int m_v; public: Int(int v) : m_v(v) { } float operator ,(int i) { int digits = 1, ii = i; float ret = m_v, place = 1; while ((ii /= 10) != 0) ++digits; while (digits) ret += int(i / std::pow(10.0, --digits)) % 10 * (place /= 10); return ret; } }; int main() { float f = (Int(1),2345); std::cout << f << std::endl; }Nur schade, dass man Operatoren nicht für PODs überladen kann.

-
Alternativ zum Ändern des Kommas in einen Punkt könnte man auch einfach den Komma-Operator überladen, um den Fehler zu korrigieren:
Üble idee.
-
GPC schrieb:
Alternativ zum Ändern des Kommas in einen Punkt könnte man auch einfach den Komma-Operator überladen, um den Fehler zu korrigieren:
Üble idee.
Ja, wenn sie ernst gemeint gewesen wäre. Das war eher ein Beispiel als Antwort zu DEvent, um zu zeigen, wie man mit dem ,-Operator schön Mist bauen kann.
-

-
oha... danke. Ihr seht, ich bin noch grün hinter den Ohren
