我正在尝试将文件中的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
这是我从未处理过的事情,让我想知道问题出在文件的读取方式还是打印方式上。
答案 0 :(得分:2)
在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库。这可能会比较慢,但可以任意精度。