2016-05-25 12 views
0

Ich schreibe ein Programm in C++, wo ich das Epsilon meines PCs finden möchte. Ich möchte das Ergebnis doppelt so genau sein (das ist 2.2204460492503131 E-16), aber stattdessen ist die Ausgabe 1.0842 E-019, die das Epsilon in langer doppelter Genauigkeit ist.returns long double statt double

Mein Programm ist dies:

#include <iostream> 

double e = 1.0; 
double x; 

int main() 
{ 

    for (int i = 0; e + 1.0!=1.0 ; i++) 
    { 
     std::cout<<e<<'\n'; 
     x = e; 
     e/=2.0; 
    } 

    std::cout << "The epsilon of this Computer is "<< x <<'\n'; 

    return 0; 
} 

Antwort

0

Output std::numeric_limits<double>::epsilon() statt. std::numeric_limits ist in der Standardkopfzeile <limits> deklariert.

Eine übliche Technik, wenn Sie es wirklich berechnen muss (und nicht Ihre Standardbibliothek zu vertrauen, einen korrekten Wert zu liefern) ist

double epsilon = 1.0; 

while ((1.0 + 0.5 * epsilon) != 1.0) 
    epsilon *= 0.5; 

oder die Berechnung zu tun.

Beachten Sie, dass (obwohl Sie haben nicht gezeigt, wie Sie es getan haben) kann es sein, tatsächlich Ihre long double Berechnung, die nicht korrekt ist, da wörtliche Floating-Point-Werte (wie 1.0) standardmäßig double vom Typ ist, nicht long double - die Macht schlagen Sie vor, der Fehler ist in Ihrer Berechnung der long double Ergebnis, nicht die double ein .. Wenn Sie möchten, dass das Ergebnis von Typ sein, wäre es ratsam, alle diese wörtlichen Werte (1.0, 0.5) die L Suffix zu geben zwinge sie dazu, vom Typ long double zu sein.

Denken Sie auch daran, beim Streaming des Ergebniswerts an std::cout die entsprechende Formatierung zu verwenden, um sicherzustellen, dass die Ausgabe auch die von Ihnen benötigte Genauigkeit/Genauigkeit aufweist. Die Standardeinstellungen (was Sie erhalten, wenn Sie die Formatierung nicht steuern) können sich unterscheiden.