Wie verhindere ich das automatische runden in c++?

4 Antworten

Gleitpunktzahlen sind bei den meisten Programmiersprachen - ohne zusätzliche Drittbibliotheken - grundsätzlich nicht als genau anzusehen.

Allerdings liegt das Problem bei dir vermutlich eher an der Ausgabe, als an der Berechnung.

Probiere mal:

cout.precision(8);

cout << deineZahl << endl;

... oder falls du das alte C-API nutzt:

printf("%.8f\n", deineZahl);

In jedem Fall solltest du verstehen, dass ein Computer mit Gleitpunktzahlen prinzipbedingt nicht genau rechnen kann, sondern nur näherungsweise an die richtige Lösung ran kommt. Für alles andere müsstest du "irrationale Zahlen" in Form von "Formeln" akzeptieren, aber "reelle Zahlen" haben nun mal einen begrenzt gültigen Bereich, erst recht, innerhalb der CPU eines Computers.

Beispiel:

if (0.1 + 0.1 + 0.1 == 0.3) {
  cout << "Gleich! :)" << endl;
} else {
  cout << "Ungleich! :(" << endl;
}

Ich habe das jetzt nicht getestet, würde aber wetten, dass dabei "Ungleich!" ausgegeben wird. Warum das so ist, findest du hier:

https://de.wikipedia.org/wiki/IEEE_754

Außerdem solltest du dich damit beschäftigen, wie du die Ausgabe von Werten formatieren kannst, sowohl bei C++-Streams, als auch bei der printf()-Familie aus C:

https://en.cppreference.com/w/cpp/io/ios_base/precision

... und ...

https://en.cppreference.com/w/cpp/io/c/fprintf

Viel Spaß! :)

Dingnau1234 
Fragesteller
 15.03.2019, 20:27

Danke, hast du vielleicht auch eine idee, wie ich das x mal x in einer rechnung verwenden könnt, z.B. 0.9*x*x + 1.3* x− 0.7, ohne dass hier x*x gerundet wird?

.

0

Was rechnest du denn mit dem X. Ne rundung kann ich hier nicht sehen.

Rechnest du X mal x? Das würde ungefähr 188 tausend rausgeben.

Sind die X Float Single oder double Variablen?

Int und Long sind ganzahl typen. Die kennen kein komma. Da wird nichts gerundet sondern schlichtweg ohne komma gerechnet.


Dingnau1234 
Fragesteller
 15.03.2019, 15:49

Die lösung sollte 188.59803561 lauten, ich habe x als double initialisiert, ja es sollte x mal x sein

0

das ist doch nicht gerundet sondern warscheinlich in anderen Zahlenformat wie Oktal dargestellt

Sofern Du cout nutzt:

std::cout<<(double val);

Ist eine formatierte Ausgabefunktion. Doku lesen!

#include <iostream>

int main(void){
        double x=13.7331;
        std::cout << std::fixed << x*x << std::endl;
        return 0;
}

So wäre eine einfache Variante.

Du darfst natürlich auch das Format selbst definieren.