C ++的数字精度和fstream的截断

时间:2014-06-25 18:18:13

标签: c++ fstream truncate floating-point-precision digits

我有一个包含数百个数字的file.txt。 它们在点之后有很多位数(最多20个),我需要在没有截断的情况下得到它们,否则它们会在以下计算中引入错误。我用matlab制作了这些数字,所以它具有可怕的精度,但现在我必须在我的程序中复制这种行为。

我这样做了:

 fstream in;
 in.open(file.txt, ios::in);
 long double number;
 in>>number;

我也试过这个

 in.precision(20);
 in>>number;

在每个“>>”之前操作但是徒劳无法

2 个答案:

答案 0 :(得分:4)

std::numeric_limits::min std::numeric_limits::digits10可以告诉您目标的实际精确度是long double

如果您发现它不足以表示您的数据,您可能需要任意精度。您可以使用几个任意精度数字库,其中没有一个是C ++中的标准数据库。

答案 1 :(得分:1)

以下在我的系统上运行正常(Win7,VS2012):

#include <fstream>
#include <iostream>

int main (void)
{
    std::ifstream file ("test.txt") ;

    long double d = 0 ;
    file >> d ;

    std::cout.precision (20) ;
    std::cout << d << "\n" ;


    return 0 ;
}

文本文件:

  
    

2.7239385667867091

  

输出:

  
    

2.7239385667867091

  

如果这不适用于您的系统,则需要使用第三方号码库。