numerik
-
hallo
habe ein numerisches problem..
wenn ich zb die zahl 0,1 in einer doubble variable speicher,
diese mit 10 multipliziere, dann kann ich sie nicht auf gleichheit mit einer integer variable checken.
es ist dann so dass die double variable kleiner als 1 ist und zwar ca um 10^-14 kleiner.
wie behebe ich diese maschinenrundnung, ohne tolleranzgrenzen einzubauen?
mfg lookias
-
krass
wenn ich
double d = 0.1; // ist im debugger 0.10.........1 lol eine 1 am schluss d = d*10; // jetzt ist sie genau 1.0000... gross
d.h. die d in int casten und dann mit nem int vergleichen
so ähnlich wie atoi
-
Tja, damit wirst Du Dich abfinden müssen. Für viele exakt darstellbare gebrochene Zahlen im Dezimalsystem gibt es keine exakte, endliche Repräsentation im Binärsystem. Von daher solltest Du immer mit Rundungsfehlern rechnen. Vergleiche zwischen Fließkommawerten sollte immer mit einer Epsilon-Umgebung durchgeführt werden (also mit tollen Ranzgrenzen ^^).
Falls Du die Genauigkeit brauchst, rechne entweder mit Integers und einem Faktor von 100, oder schau Dir mal BCDs an.
-
okay ich werd die loesung von meinem dozenten abwarten,
das mit den integern is sicherlich ne gute idde, aber wir sollen das alles normalisierte gleitkommazahl darstellen und rechnen.
vielleicht koenntest du mir maln guten tutorial zu bcd sagen.
mfg lookias
-
Vieleicht annst du <complex> gebrauchen.
Was willst du den machen?
-
Green_Ghost: Wo soll den da complex helfen?
Meinst du etwa das ist nicht der Maschinengenauigkeit unterworfen?
-
#include<iostream> #include<math.h> using namespace std; int b,t; long pow(int i) { if(i>0) return(b*pow(i-1)); else return 1; } double verkleinern(double x) { while(x>1) x=x/b; return x; } double vergroessern(double x) { while(x<1/b) x=x*b; return x; } int main() { int hilf; double x; long y=0; cout<<"geben sie die basis an: "; cin>>b;cout<<endl; cout<<"geben sie die stellenzahl (kleiner 6) an: "; cin>>t; cout<<endl<<"geben sie jetzt die zahl in dezimaldarstellung an, es wird getestet ob sie als gleitkommazahl der gewaehlten basis und der stellenzahl exakt darstellbar ist: "; cin>>x;cout<<endl; if(x>1) x=verkleinern(x); else x=vergroessern(x); for(int i=0;i<=t;i++) { cout<<"x ist: "<<x*pow(i)<<endl; hilf=x*pow(i); cout<<"hilf ist: "<<hilf<<endl; x=(x*pow(i)-hilf)/pow(i); y=y+hilf*pow(t-i); cout<<"y ist: "<<y<<endl; } cout<<endl<<"y ist: "<<y<<endl; cout<<"ergebnis: "<<y<<endl; }
wenn man zb basis 10 stellenzahl 4 und dann zb 1.333 eingibt ist das ergebnis 1332 wegen dieser rundung