从文件中读取时精度为 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 库。这可能会更慢,但允许任意精度。