为什么在显示矢量<长双精度>时看不到所有有效数字?
Why can't I see all the significant digits when displaying vector<long double>?
我有一个控制台应用程序,它有一个函数可以划分斐波那契数列的整数,演示任何斐波那奇数列中的比率如何接近Φ。我有用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 int
到long double
是下变频而出现问题?我需要将fib系列作为vector<long double>
传递吗?怎么了?
编辑:
这个问题被标记为重复,但这并不是真正正确的,因为这个问题没有直接涉及cout
:尽管分析证明cout
就是问题所在,但还有其他因素可能会产生影响。我发布了正确答案:
问题出在cout身上,下面是解决方案。。。如中所述另一个问题。。。
听起来您想将:std::numeric_limits<T>::max_digits10
与std::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 << "; ";
}
}
- 我不断收到 [错误] ID 返回 1 退出状态错误,但看不到问题所在
- 无符号的 int 到有效数字
- 看不到文件'SDL2.lib'
- WSL 看不到环境变量
- 为什么我的 FreeRTOS 任务看不到类成员?
- Google Colab 看不到 .so 文件
- 派生类看不到基类成员
- 为什么我看不到字符串?
- CMake 看不到SDL2_PATH环境变量 (Windows)
- OpenMP 任务看不到共享变量的更改
- handleMessage看不到我的类和函数
- 为什么 connect() 函数看不到插槽?
- 模板类看不到继承的模板成员
- 为什么即使链接器找到目标文件,我的程序也看不到函数定义?
- 将 somedialog.h 包含在项目的其他部分中会使编译器看不到 ui_somedialog.h
- SFML - 代码::块看不到 sfml 图形(等)文件
- CMake 看不到源文件,找不到 #includes
- ifstream在OSX上看不到新内容
- C++概念看到我的类型的函数,但看不到 std::vector 的函数
- 为什么在显示矢量<长双精度>时看不到所有有效数字?