从文件中读取时精度为 double
Precision of double when reading from file
我正在尝试将文件中的 double
值读入 std::vector
。但是,我注意到这些值与文件中的内容不匹配,但有轻微但一致的 ~0.000000007
偏移。这正常吗?
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
#include <vector>
std::vector< double > readFromFile(const std::string& file_name) {
std::vector< double > values;
std::ifstream file(file_name.data(), std::ios::in);
file.precision(9); // makes no difference
double value = 0.0;
if (file.is_open()){
while (file >> value) {
values.push_back(value);
}
file.close();
}
return values;
}
int main(int argc, char const *argv[]) {
auto vals = readFromFile("src/samples.txt");
std::cout.precision(9);
for (auto& val : vals) {
std::cout << std::fixed << val << std::endl;
}
return 0;
}
我的samples.txt
:
1595519203.966806166
1595519204.000087015
1595519204.033377640
1595519204.066651098
代码输出:
1595519203.966806173
1595519204.000087023
1595519204.033377647
1595519204.066651106
这是我从未处理过的事情,我想知道问题是出在文件的读取方式上,还是出在我的打印方式上。
在10^10范围内,64位IEEE 754 double-precision floating point numbers的精度约为10^-6。所以,是的,这种不一致是正常的,无法避免。
如果您想要更高的精度,那么您可能想尝试使用 long double
。某些平台为 80 位或 128 位浮点数提供硬件或软件支持。但是,在某些平台上(例如 Microsoft C++ 编译器),long double
等同于 64 位 double
.
如果 long double
还不够,那么您将不得不恢复使用软件 bignum 库。这可能会更慢,但允许任意精度。
我正在尝试将文件中的 double
值读入 std::vector
。但是,我注意到这些值与文件中的内容不匹配,但有轻微但一致的 ~0.000000007
偏移。这正常吗?
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
#include <vector>
std::vector< double > readFromFile(const std::string& file_name) {
std::vector< double > values;
std::ifstream file(file_name.data(), std::ios::in);
file.precision(9); // makes no difference
double value = 0.0;
if (file.is_open()){
while (file >> value) {
values.push_back(value);
}
file.close();
}
return values;
}
int main(int argc, char const *argv[]) {
auto vals = readFromFile("src/samples.txt");
std::cout.precision(9);
for (auto& val : vals) {
std::cout << std::fixed << val << std::endl;
}
return 0;
}
我的samples.txt
:
1595519203.966806166
1595519204.000087015
1595519204.033377640
1595519204.066651098
代码输出:
1595519203.966806173
1595519204.000087023
1595519204.033377647
1595519204.066651106
这是我从未处理过的事情,我想知道问题是出在文件的读取方式上,还是出在我的打印方式上。
在10^10范围内,64位IEEE 754 double-precision floating point numbers的精度约为10^-6。所以,是的,这种不一致是正常的,无法避免。
如果您想要更高的精度,那么您可能想尝试使用 long double
。某些平台为 80 位或 128 位浮点数提供硬件或软件支持。但是,在某些平台上(例如 Microsoft C++ 编译器),long double
等同于 64 位 double
.
如果 long double
还不够,那么您将不得不恢复使用软件 bignum 库。这可能会更慢,但允许任意精度。