Nachkommastellen
-
Ich habe eine Konsolenanwendung geschrieben, die naeherungsweise eine Quadratwurzel berechnet. Obwohl ich alle Variablen als "double" definiert habe, ist die Ausgabe nach der vierten Nachkommastelle gerundet. An was kann das liegen und wie bekomme ich mehr Nachkommastellen? (Bin leider blutiger Anfaenger)
Danke im Voraus!!!
-
Zeig doch mal deinen Code!
-
1. Ein Double kann ca. 14 Stellen richtig speichern, ich nehme mal an, dass du nicht 10 Stellen vor dem Komma hast?
2. Steht dann da 3.452900000000000 oder nur 3.4529, dann wäre nämlich ein Problem der Formatierung deiner Ausgabe?
-
#include <iostream> #include <cstdio> int main() { double quadratwurzel = sqrt(10.0); //C-Style printf("%.15f\n", quadratwurzel); //C++-Style cout.precision(15); cout << quadratwurzel << endl; }
-
printf("%.15lf\n", quadratwurzel);
%lf gibt double aus ...
-
Scheppertreiber schrieb:
printf("%.15lf\n", quadratwurzel);
%lf gibt double aus ...
Ich dachte, das wär beim Output egal
-
warum sollte das beim printf egal sein? woher soll printf denn wissen was für ein datentyp ausgegeben werden soll und wie die speicherstelle des parameters interpretiert werden soll?
-
dull schrieb:
warum sollte das beim printf egal sein? woher soll printf denn wissen was für ein datentyp ausgegeben werden soll und wie die speicherstelle des parameters interpretiert werden soll?
Es weiß es nicht. Also muß man printf das halt schonend per Format-String beibringen ...
-
Scheppertreiber schrieb:
%lf gibt double aus ...
Nein, %f gibt double und float aus. Eine Unterscheidung ist da (im Gegensatz zu scanf) nicht notwendig, weil ein float automatisch in double konvertiert wird, wenn er als Teil einer variablen Argumentliste übergeben wird.
-
Siehe Link:
http://www.cplusplus.com/reference/clibrary/cstdio/printf/
bei der Tabelle length.
-
MFK schrieb:
weil ein float automatisch in double konvertiert wird, wenn er als Teil einer variablen Argumentliste übergeben wird.
Steht das irgendwo in einem "offiziellem" Dokument?
Gilt das auch für Targets bei denen nur für 32Bit-float ein nativer Hardware-Support vorhanden ist und 64Bit-double zwar vom Compiler unterstützt wird aber per SW emuliert werden muss?
-
Frager schrieb:
Steht das irgendwo in einem "offiziellem" Dokument?
Ja, im C-Standard. Wo sonst :p
Irgendwo unter "Promotions".
Gilt das auch für Targets bei denen nur für 32Bit-float ein nativer Hardware-Support vorhanden ist und 64Bit-double zwar vom Compiler unterstützt wird aber per SW emuliert werden muss?
Ja, theoretisch schon. Kann aber sehr gut sein, dass der Compiler eine Option bietet, mit der man zwischen strikter ANSI-Konformität und effizienterem Code umschalten kann.