Frage zu cout/printf
-
Du bist immer noch im Quizshowmodus.
-
Bei mir
cout bei double 2.32793e+08
cout bei double mit cout.setf(cout.scientific) 2.327926e+08
printf bei double 232792560.000000
cout/printf bei long long 232792560Tausende vorbei ist das jetz nicht.
-
uncannysnake schrieb:
Eine andere Zahl als die richtige
Ganz normale Zahl, ungefähr ein paar tausend von der richtigen entfernt, beide im 200 Millionen Bereich. Weiß sie aber nicht mehr auswendig.Aber eigentlich wollte ich wissen warum cout so heftig auf das double reagiert
In beiden Fällen wird die gleiche Zahl ausgegeben. Nur bei cout auf 6 Stellen gerundet, da Du bei cout keine weiteren Angaben für die Formatierung gemacht hast. Default ist 6.
-
gary1195 schrieb:
Bei mir
cout bei double 2.32793e+08
cout bei double mit cout.setf(cout.scientific) 2.327926e+08
printf bei double 232792560.000000
cout/printf bei long long 232792560Tausende vorbei ist das jetz nicht.
Ist doch alles korrekt?
-
ja, warum wird hier gerundet?
sorry, bemerk das jetzt erst wo ich die zahlen nebeneinander sehe
-
uncannysnake schrieb:
ja, warum wird hier gerundet?
sorry, bemerk das jetzt erst wo ich die zahlen nebeneinander seheKenner der Ausgabe schrieb:
In beiden Fällen wird die gleiche Zahl ausgegeben. Nur bei cout auf 6 Stellen gerundet, da Du bei cout keine weiteren Angaben für die Formatierung gemacht hast. Default ist 6.
Und das ist übrigens bei printf und bei den C++-Streams exakt gleich.
-
.. ist zwar OT, aber der obige Algorithmus lässt sich wesentlich beschleunigen:
#include <iostream> #include <limits> // numeric_limits // -- ggt & kgV int ggT( int a, int b ) // größter gemeinsamer Teiler { return a == 0? b: ggT( b%a, a ); } int kgV( int a, int b ) // kleinstes gemeinsames Vielfaches { const int gt = ggT( a, b ); return (a/gt) * b; } // ... und schon wird es einfach und schnell int main() { using namespace std; int ergebnis = 1; for( int i = 1; i <= 20; ++i ) ergebnis = kgV( i, ergebnis ); cout.precision( numeric_limits<int>::digits10 ); // damit auch alle Ziffern in der Ausgabe erscheinen cout << ergebnis << endl; }
-
uncannysnake schrieb:
ja, warum wird hier gerundet?
sorry, bemerk das jetzt erst wo ich die zahlen nebeneinander seheWieviel Stellen soll es denn standardmäßig ausgeben? Eine? Hundert? Nee, der Standard sieht 6 vor und wenn du die Ausgabe genauer haben willst, musst du das selbst angeben. Du kannst die Zahl sogar mit nur einer Nachkommastelle ausgeben, dann wird auch gerundet.
#include <iostream> #include <iomanip> #include <cmath> #include <limits> int main() { const long double pi = std::acos(-1.L); std::cout << "default precision (6): " << pi << '\n' << "std::precision(10): " << std::setprecision(10) << pi << '\n' << "max precision: " << std::setprecision(std::numeric_limits<long double>::digits10) << pi << '\n'; }Oder so ähnlich. Ausgabe:
default precision (6): 3.14159 std::precision(10): 3.141592654 max precision: 3.14159265358979324Auch interessant:
std::fixed,std::scientific,std::hexfloat,std::defaultfloat
Siehe auch:
http://en.cppreference.com/w/cpp/io/manip/fixed
-
Wobei dein Ausdruck "max_precision" hier irreführend ist. Erstens kann die Zahl, die ausgegeben wurde, kann (und wird in vielen Fällen, so wie in diesem Beispiel) in der Regel noch viel mehr Dezimalstellen haben. Zweitens ist digits10 die Anzahl der "sicheren" Dezimalstellen. Diese reicht aber nicht aus, um daraus umgekehrt auf die gespeicherte Zahl zu schließen. Dafür gibt es max_digits10.
3.1415926535897932384626433832795028841971693993751 // Pi, mathematisch, 50 Stellen 3.1415926535897932385128089594061862044327426701784 // Pi aus Programm, 50 Stellen 3.14159265358979324 // Pi aus Programm, "max_precision" Stellen 3.14159265358979323851 // Pi aus Programm, max_digits10 Stellen
-
Pi aus Programm, 50 Stellen
2*std::asin(1.L)?
-
Arcoth schrieb:
Pi aus Programm, 50 Stellen
2*std::asin(1.L)?Nein, das, was oenone geschrieben hat, übernommen. Also
std::acos(-1.L);