Runden auf 4 signifikante Stellen
-
Lemontime schrieb:
Ich habe es jetzt so weit gemacht wie es ging nun habe ich das Problem das er bei mir das "pow10" nicht erkennt obwohl es ja im <math.h> enthalten ist an was kann das liegen ?
Das liegt daran, dass es keine pow10-Funktion gibt. In math.h gibt es nur pow().
-
Nun kommt die Fehlermeldung:
Error: Keine Instanz von Überladene Funktion "pow" stimmt mi der Argumentliste überein.
-
Lemontime schrieb:
Nun kommt die Fehlermeldung:
Error: Keine Instanz von Überladene Funktion "pow" stimmt mi der Argumentliste überein.Du nutzt einen C++-Compiler für C. Tu das nicht.
-
Und lass mal deine Funktion auf negative Werte los.
-
Lemontime schrieb:
Nun kommt die Fehlermeldung:
Error: Keine Instanz von Überladene Funktion "pow" stimmt mi der Argumentliste überein.double pow10 ( double exponent ) { return pow ( 10, exponent ); }
oder noch besser die round funktion anpassen
-
berniebutt schrieb:
CJosef schrieb:
Falls du damit rechnen willst, so dass obige Zahl zu 0.7778 gerundet wird ...
Dann kannst du die Funktion round() auf meiner HP http://berniebutt.npage.de herunterladen oder nach etwas anderem suchen.
double num = round ( 4.015, 2 ); printf ("%lf\n", num );
4.010000
-
Da kann berniebutt nichts für. Die genaueste Repräsentation von 4.015 im gängigen Fließkommaformat ist eine Zahl, die ein kleines bisschen kleiner als 4.015 ist.
-
Entweder hat der C-Compiler eine solche Funktion double = round(double value, int precision) zu bieten oder die ersatzweise eigene Funktion muss stimmen. Danke für den Bughinweis! Wird korrigiert - morgen gemacht. Oder tobt euch da aus - ist eine gute Übung im Umgang mit Fliesskommazahlen und dem Gebrauch von eps!
long double round(long double value, unsigned short np) // --------------------------------------------------------------------------- // round a long double value to a precision of np // --------------------------------------------------------------------------- { long double val, val1, val2. val3, result, eps; long double factor,add; eps = 0.0000001; if(val < 0.000) eps = -eps; val = value + eps; factor = pow10l(np); val1 = floorl(val*factor)/factor; val2 = (val - val1) * factor; if (val2 > 0.5) add = 1.00; else add = 0.00; val3 = val1 + add /factor; return val3; }
Und haut mich!
-
berniebutt schrieb:
Entweder hat der C-Compiler eine solche Funktion double = round(double value, int precision) zu bieten oder die ersatzweise eigene Funktion muss stimmen. Danke für den Bughinweis! Wird korrigiert - morgen gemacht. Oder tobt euch da aus - ist eine gute Übung im Umgang mit Fliesskommazahlen und dem Gebrauch von eps!
der compiler hat funktionen zu bieten?
oder meinst du die standardbibliothek?
-
verwirrter schrieb:
der compiler hat funktionen zu bieten?
oder meinst du die standardbibliothek?Compiler müssen die allgmeinen Standardfunktionen haben und bieten oft mehr. Die Funktion double round(double,int) gehört nicht zu den Standardfunktionen. Die von mir korrigierte Funktion ist toplastig für alte 16/32-bit Compiler ausgerichtet. Eine Anpassung fällt aber nicht schwer. Wer will kann sich mit der Verbesserung gerne austoben und für eine Optimierung über z.B. 10000 Durchläufe etwas Performance herauskitzeln. Das gehört aber nicht mehr unbedingt zum Thema!
-
berniebutt schrieb:
[cpp]long double round(long double value, unsigned short np)
// ---------------------------------------------------------------------------
// round a long double value to a precision of np
// ---------------------------------------------------------------------------
{
long double val, val1, val2. val3, result, eps;
long double factor,add;eps = 0.0000001;
if(val < 0.000) eps = -eps;
val = value + eps;factor = pow10l(np);
val1 = floorl(val*factor)/factor;
val2 = (val - val1) * factor;
if (val2 > 0.5) add = 1.00;
else add = 0.00;
val3 = val1 + add /factor;return val3;
}
[/cpp]Täusch ich mich, oder ist dein erster Vergleich direkt mit einer uninitialisierten Variable?
-
Falsch übernommen - jetzt korrigiert!
-
berniebutt schrieb:
Falsch übernommen - jetzt korrigiert!