Sie können Ihren Kuchen nicht haben und essen es auch! :)
Ich meine, wollen Sie die genaue Darstellung einer Zeichenkette in einer Reihe, ohne die Kosten in Bezug auf Speicher zu zahlen (um nur die Zeichenfolge zu speichern *).
Also in diesem Fall das Beste, was Sie tun könnten, ist eine long double
verwenden, wissen Sie, die L
wir am Ende der numerischen Konstanten anhängen. Das hat natürlich auch seine Grenzen (da unser Computer auch Grenzen hat). Darüber hinaus, was für eine Verschwendung von Speicherplatz (und Bearbeitungszeit) würde es sein, eine long double
für Zahlen, die nicht brauchen, zu verwenden, da Sie sagen, dass die Genauigkeiten, die Sie erfüllen werden, nicht behoben sind. So konnten Sie das tun mit diesem Code (freundlicherweise zusammengebaut, indem this und this Antworten und die std::numeric limits):
#include <fstream>
#include <vector>
#include <cstdlib>
#include <iostream>
#include <limits>
typedef std::numeric_limits<double> dbl;
int main() {
std::ifstream ifile("example.txt", std::ios::in);
std::vector<long double> scores;
//check to see that the file was opened correctly:
if (!ifile.is_open()) {
std::cerr << "There was a problem opening the input file!\n";
exit(1);//exit or do additional error checking
}
long double num = 0.0;
//keep storing values from the text file so long as data exists:
while (ifile >> num) {
scores.push_back(num);
}
std::cout.precision(dbl::max_digits10); // you can print more digits if you like, you won't the exact representation obviously
//verify that the scores were stored correctly:
for (int i = 0; i < scores.size(); ++i) {
std::cout << std::fixed << scores[i] << std::endl;
}
return 0;
}
die auf meinem Rechner gibt:
C02QT2UBFVH6-lm:~ gsamaras$ cat example.txt
3.12345678912345678912345678 2.79
C02QT2UBFVH6-lm:~ gsamaras$ g++ -Wall main.cpp
C02QT2UBFVH6-lm:~ gsamaras$ ./a.out
3.12345678912345679
2.79000000000000000
Wenn Sie möchten, um noch weiter zu gehen, dann benutze GMP, was "eine freie Bibliothek für beliebige Präzisionsarithmetik" ist. Natürlich wird dies nicht kostenlos in Bezug auf die Speicherauslastung und Verarbeitungszeit kommen, so sollten Sie wirklich zweimal überlegen vor der Verwendung!
* ich das Gefühl, dass Sie ein Opfer der vorzeitigen Optimierung sind. Wenn ich Sie wäre, würde ich einfach die Strings speichern und sehen, wie das geht, oder besser noch einen numerischen Datentyp verwenden, wodurch ich etwas an Präzision einbüße, was Ihr Leben viel einfacher macht. Wenn das Projekt fertig ist, sehen Sie, welche Ergebnisse Sie erhalten und ob die erreichte Präzision "Ihrem Chef" gefällt. Wenn nicht, verwenden Sie Zeichenfolgen (oder gmp).
* "Ich lese Werte aus einer Textdatei und konvertiere sie in Doppel, dann muss ich diese Werte auf dem Bildschirm drucken, und sie sollten genauso aussehen wie in der Textdatei." * - This erfordert, dass Sie Ihre Zahlen als Zeichenfolgen speichern. Unter der Annahme, dass Ihre Textdatei Basis-10-Nummern speichert und Gleitkommazahlen als Base-2 auf Ihrem System gespeichert sind, können Sie in Ihrer Zielcodierung niemals die Quellnummer darstellen. Sie müssen die Fäden in der Hand halten. Dies ist alles nur vorzeitige Optimierung, also verschrotten Sie es und speichern Sie die Zahlen als Zeichenfolgen. Es ist ** das ** einfach, wirklich. – IInspectable
Sie könnten boost.multiprecision vielleicht versuchen. Die Speicherung als String ist jedoch die einfachste Lösung. –
Der Fall ist, dass wir minimalen Speicher verwenden müssen, um die Anforderungen zu erfüllen, also Strings werden einfach nicht tun: S – nancyheidilee