Heron-Verfahren C++ verbessern
-
Hallo liebe Programmierer!
Ich hab hier diesen C++ Code, ein Iterationsverfahren nach Heron
Nur leider rechnet das Programm nach der 2 Näherung nicht mehr weiter und setzt ungefähr ab der 33-37 Dezimalstelle nur noch 0'len. Kann mir jemand helfen?#include <iostream> using namespace std; #include <iostream> using namespace std; int main(){ float a, x, eq; // a = Radikand // x = Startwert // eq = Formel int i=0; // Schleifenzähler printf("Bitte geben Sie den Radikand ein:\t"); cin >> a; printf("Bitte geben Sie den Startwert ein:\t"); cin >> x; //Formel eq = 0.5*( x + a / x ); cout << eq << endl; // 1.Näherungswert while(eq - x > 1/1000000 || i <= 30){ // berechne... x = eq; i++; eq = 0.5*( x + a / x ); cout << "Der " << i << ". Näherungswert ist: " << eq << endl; cout.precision ( 35 ); } system("pause"); }
-
Dein precision 35 ist reines Wunschdenken, wenn du mit Datentypen rechnest, die auf 7 Stellen genau sind....
-
Okay und was kann man dagegen machen?
-
Datentypen mit größerer Präzision benutzen?
-
Hab's jetzt schon mit long double versucht, funktioniert aber auch nicht
-
Aber auch da wirst du früher doer später auf Grenzen stoßen.
-
Du solltest dir auch mal angucken, was 1/1000000 wirklich ist. Wird zwar wahrscheinlich nicht das Problem beheben, aber ohne bessere Problembeschreibung (was erwartest du, was passiert stattdessen?) habe ich nicht so die Motivation alles ganz genau anzugucken.
-
Nur aus Interesse:
Gibt es empfehlenswerte Bibliotheken für Berechnungen mit hoher Präzision?
Gruß,
temi
-
ja.
Wolltest du auch noch wissen, welche das sind - schau mal bei Wikipedia vorbei:
https://en.wikipedia.org/wiki/List_of_C%2B%2B_multiple_precision_arithmetic_libraries
GMP / MPFR wären dann mal zwei Beispiele.
Habe allerdings selbst keine Erfahrung damit.
-
Danke, wob.
Die Betonung lag eher auf empfehlenswert, also:
Hat jemand gute Erfahrungen mit einer bestimmten Lib gemacht? Einfach anwendbar, usw.
Wie schon geschrieben, rein interessehalber, ich brauch das aktuell nicht, aber ich lerne gerne dazu.
-
btw:
while(eq - x > 1/1000000 || i <= 30)->
while( eq > x || i <= 30 )
-
Das Problem steckt in Zeile 24 - sie enthält 3 Fehler - in Worten: drei
probiere:while(abs(eq - x) > 1./1000000 && i <= 30){ // berechne...
und inkludiere
#include <cmath> // std::abs