C++ 为什么可以';t我在显示矢量时看到所有有效数字<;长双人床>;?
我有一个控制台应用程序,它有一个函数,可以对Fibonacci数列的整数进行除法,演示任何Fibonacci数列中的比率如何接近Φ。我用Go和C++ 为什么可以';t我在显示矢量时看到所有有效数字<;长双人床>;?,c++,math,c++11,floating-point-precision,C++,Math,C++11,Floating Point Precision,我有一个控制台应用程序,它有一个函数,可以对Fibonacci数列的整数进行除法,演示任何Fibonacci数列中的比率如何接近Φ。我用Go和C++11编写了simliar代码。在Go(或科学计算器)中,函数返回int64的值,结果显示Ubuntu终端会话的精度高达16位,例如: 1.6180339937902115 在C++11中,使用cout,我看不到超过5位精度的结果。结果在如下函数中声明为long double: typedef unsigned long long int ULInt
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;
}
typedef无符号长整型;
typedef std::vectorULIntV;
标准::矢量计算序列(常数ULIntV和fib)
{
std::向量结果;
for(inti=0;i!=fib.size();i++)
{
如果(i==(纤维大小()-1))
{
结果[i]=0;
打破
}
长双n=fib[i+1];
长双n2=fib[i];
长双q=n/n2;
结果:推回(q);
}
返回结果;
}
尽管传递到CalcSequenceRatio(const ULIntV&fib)
的向量fib
包含100多个条目,但在16个条目之后,结果集中的所有值都显示为
1.61803
其余的值被四舍五入,尽管在Go(或计算器)中,我可以看到实际值扩展到至少16位精度
如何使CalcSequenceRatio()
返回更精确的值?是否存在问题,因为从long-long-int
到long-double
是向下转换?我是否需要将fib序列作为向量传递?怎么了
编辑:
这个问题被标记为重复,但这并不是真正正确的,因为这个问题并没有直接涉及到cout
:虽然分析证明问题出在cout
,但还有其他因素可能会造成不同。我发布了正确的答案:
问题在于cout,这里是解决方案。。。如中所述
另一个问题
这里的问题在于
std::cout
我使用std::setprecision(50)
修复了它,如中所述,其中显示了如下值:
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;
}
1.61803398749894848207210029669248109537875279784
为了使其灵活,我给用户提供了输入所需精度级别的选项:
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 << "; ";
}
void printGolden(const std::vector&golden)
{
精密度;
std::cout这里的问题在于std::cout
我使用std::setprecision(50)
修复了它,如中所述,其中显示了如下值:
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;
}
1.61803398749894848207210029669248109537875279784
为了使其灵活,我给用户提供了输入所需精度级别的选项:
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 << "; ";
}
void printGolden(const std::vector&golden)
{
精密度;
std::cout这里的问题在于std::cout
我使用std::setprecision(50)
修复了它,如中所述,其中显示了如下值:
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;
}
1.61803398749894848207210029669248109537875279784
为了使其灵活,我给用户提供了输入所需精度级别的选项:
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 << "; ";
}
void printGolden(const std::vector&golden)
{
精密度;
std::cout这里的问题在于std::cout
我使用std::setprecision(50)
修复了它,如中所述,其中显示了如下值:
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;
}
1.61803398749894848207210029669248109537875279784
为了使其灵活,我给用户提供了输入所需精度级别的选项:
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 << "; ";
}
void printGolden(const std::vector&golden)
{
精密度;
std::cout听起来您想使用:用于不同的“往返”转换-与std::setprecision
结合使用
e、 例如,对于float
这通常是(9)
=>或1.8
格式。double
通常是(17)
=>1.16
长双精度
通常在x86上实现为80位类型,或128位类型,分别为(21)
=>1.20
和(36)
=>1.35
格式。然而,长双精度
仅要求提供至少与双精度
相同的精度
有一系列关于相关主题的注释。听起来你想使用:用于不同的“往返”转换-与std::setprecision
结合使用
e、 例如,对于float
这通常是(9)
=>或1.8
格式。double
通常是(17)
=>1.16
长双精度
通常在x86上实现为80位类型,或128位类型,分别为(21)
=>1.20
和(36)
=>1.35
格式。然而,长双精度
仅要求提供至少与双精度
相同的精度
有一系列关于相关主题的注释。听起来你想使用:用于不同的“往返”转换-与std::setprecision
结合使用
e、 例如,对于float
这通常是(9)
=>或1.8
格式。double
通常是(17)
=>1.16
长双精度
通常在x86上实现为80位类型,或128位类型,分别为(21)
=>1.20
和(36)
=>1.35
格式。然而,长双精度
只需要提供至少与相同的精度