【问题标题】:C++ precision of numbers and truncation with fstream数字的 C++ 精度和 fstream 截断
【发布时间】:2014-08-16 10:26:03
【问题描述】:

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

我是这样做的:

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

我也试过了

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

在每个“>>”操作之前都是徒劳的

【问题讨论】:

  • 你运气不好 - 通常,long double 只有 18 位精度 (link to a demo that shows you how to determine precision on your own system)。
  • precision() 用于打印,而不是阅读。您的编译器可能提供非标准的 128 位浮点类型,或者您可以使用任意精度库。
  • 如果我在我的代码中复制并粘贴这些数字一切顺利,但我无法使用数百个数字和文件来做到这一点
  • 一个问题:matlab-values 是否精确(它们可能更早打印为 20 位和松散的精度)?
  • 按照@Dieter 的思路,Matlab 中的默认数据类型通常是 64 位双精度。

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


【解决方案1】:

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

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

【讨论】:

  • long double: 3.3621e-4932 我的一个号码是 2.7239385667867091 我怎样才能读取它的所有数字?如果我将这个数字粘贴到我的代码中,一切顺利,因为它是 matlab,所以它一定是函数问题,而不是精度问题,不是吗?
  • std::numeric_limits::min 告诉您最小的可表示数字,而不是精度。 std::numeric_limits::digits10 告诉您精度(即有效数字的最大数量)。
【解决方案2】:

以下在我的系统(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

如果这在您的系统上不起作用,那么您需要使用第三方号码库。

【讨论】:

  • 好的,我可以得到相同的输出,但这些数字的计算最终是不正确的。输出精度和计算精度有区别吗?
  • 如果我手动输入数字,计算是正确的。我认为这一切都是由于这个加载
  • @user3290180 是的,输出精度和计算精度之间可能存在差异。您的调试器可以告诉您加载是否存在问题。也许您应该编辑您的问题以显示计算不起作用的一个简洁的小示例。我有一种感觉,看汇编代码会告诉你为什么一个是对的,另一个是错的。
猜你喜欢
  • 1970-01-01
  • 2019-03-13
  • 2019-03-06
  • 2012-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多