为什么在显示矢量<长双精度>时看不到所有有效数字?

Why can't I see all the significant digits when displaying vector<long double>?

本文关键字:看不到 有效数字 gt 显示 为什么 lt 双精度      更新时间:2023-10-16

我有一个控制台应用程序,它有一个函数可以划分斐波那契数列的整数,演示任何斐波那奇数列中的比率如何接近Φ。我有用Go和C++11编写的simliar代码。在Go(或科学计算器)中,函数返回int64的值,结果显示Ubuntu终端会话中的精度高达16位,例如:

1.6180339937902115

在C++11中,在使用cout的结果中,我看不到超过5位数的精度。结果在如下函数中声明为long double

typedef unsigned long long int ULInt;
typedef std::vector< ULInt> ULIntV;
std::vector<long double > CalcSequenceRatio( const ULIntV& fib )
{
    std::vector<long double> result;
    for ( int i = 0; i != fib.size( ); i ++ )
    {
         if ( i == ( fib.size( ) - 1 ) )
         {
             result[i] = 0;
             break;
          }
    long double n = fib[i + 1];
    long double n2 = fib[i];
    long double q = n / n2;
    result.push_back( q );
  }
     return result;
 }

尽管传递到CalcSequenceRatio( const ULIntV& fib )的向量fib包含100多个条目,但在16个条目之后,结果集中的所有值都显示为

1.61803

其余的值是四舍五入的,尽管在Go(或计算器)中,我可以看到实际值至少扩展到16位精度。

如何使CalcSequenceRatio()返回更精确的值?是否因为从long long intlong double是下变频而出现问题?我需要将fib系列作为vector<long double>传递吗?怎么了?

编辑:

这个问题被标记为重复,但这并不是真正正确的,因为这个问题没有直接涉及cout:尽管分析证明cout就是问题所在,但还有其他因素可能会产生影响。我发布了正确答案:

问题出在cout身上,下面是解决方案。。。如中所述另一个问题。。。

听起来您想将:std::numeric_limits<T>::max_digits10std::setprecision一起用于不同的"往返"转换。

例如对于float,这通常是(9)=>或1.8格式。double通常为(17)=>1.16

long double通常在x86上实现为80位扩展精度类型,或128位四精度类型,分别具有(21)=>1.20(36)=>1.35格式。然而,long double只需要提供至少与double相同的精度。

这里有一系列关于相关主题的笔记。

这里的问题是std::cout

我使用std::setprecision(50)修复了它,如中所述。如何使用cout以全精度打印双值这向我展示了这样的价值观:

1.6180339887498948482072100296669248109537875279784

为了使其灵活,我为用户提供了输入所需精度级别的选项:

void printGolden( const std::vector<long double>& golden )
{
    cout << "Enter desired precision:" << endl;
    int precision{};
    cin >> precision;
    std::cout << std::setprecision( precision );
    for ( auto i : golden )
    {
      std::cout << i << "; ";
    }

}