从文件读取时精度翻倍

时间:2020-09-17 23:31:33

标签: c++ io double precision fstream

我正在尝试将文件中的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

这是我从未处理过的事情,让我想知道问题出在文件的读取方式还是打印方式上。

1 个答案:

答案 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库。这可能会比较慢,但可以任意精度。