Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Long double不作为我初始化它时使用的常量打印_C++_Variables_Compilation - Fatal编程技术网

C++ Long double不作为我初始化它时使用的常量打印

C++ Long double不作为我初始化它时使用的常量打印,c++,variables,compilation,C++,Variables,Compilation,可能重复: 我有个问题。。。编译src时,显示的变量与我初始化的变量不同,请参见: #include <iostream> using namespace std; int main() { long double mynum = 4.7; cout.setf(ios::fixed,ios::floatfield); cout.precision( 20 ); cout << mynum <

可能重复:

我有个问题。。。编译src时,显示的变量与我初始化的变量不同,请参见:

#include <iostream>

    using namespace std;

    int main()
    {
      long double mynum = 4.7;
      cout.setf(ios::fixed,ios::floatfield);
      cout.precision( 20 );
      cout << mynum << endl;
    }

如何修复它?我想“cout”显示4.700000…

大多数平台,包括您的平台,只能精确地表示具有短的有限二进制扩展的浮点数,即二的幂的有限和。4.7不是这样一个数字,因此无法在您的平台上精确表示,如果您要求过高的精度(20太高,因为尾数有64位,log_10(64)是19.27),那么您将不可避免地面临小错误


(然而,正如@Henning所说,当从(非长)双精度赋值时,您已经失去了精度;您应该将文字常量写成长双精度:
4.7L
。然后您应该只在第20位中看到错误。)

某些数字不能用基数2表示。显然,4.7就是其中之一。您看到的是最接近4.7的可表示数字


对此,除了将精度设置为较低的数字外,您无能为力。

float
s和
double
s是二进制浮点类型,即它们在基数2中存储尾数和指数

这意味着任何无法精确表示为尾数有限位数的十进制数都将被近似化;您显示的问题来自于此:4.7不能精确表示为
double
的尾数(字面
4.7
double
类型,值得称赞的是@Henning Makholm发现了它),因此使用了最接近的近似值

为了更好地可视化问题:在基数3中,2/3是一个有限表示的数字(即0.23),而在基数10中,它是一个周期数(066666…);如果只有有限的数字空间,则必须执行一个近似值,即06667。这里的情况完全相同,源基数为10,“目标”基数为2


如果特别需要避免这种近似(例如,在处理十进制金额时),可以使用特殊的
decimal
类型,以10为基数存储尾数和指数(C++本身不提供这种类型,但网络上有许多
decimal
类);尽管如此,对于“正常”/“科学计算”,仍然使用二进制FP类型,因为它们更快、更节省空间。

您的变量是
long double
,但文本
4.7
的默认精度仅为
double
。由于您将其打印为
long double
,因此解释会选择使用足够的有效数字打印,以将其与相邻的
long double
值区分开来,即使这些相邻值不可能是双精度double

双精度的内部表示也不允许4.7的“精确”表示。“最近的”是4.700000000000017764。事实上,当您使用64位双倍运算时,不需要考虑20的精度。最大有效精度约为15。试着用12个左右

cout.precision( 12 );

你应该得到你想看的东西。

。。。又来了,这个问题重复了600万亿次。搜索“浮点不精确性”。“长双精度比我的文字常量更精确”的角度在所有600万亿次重复中并不完全存在。解决方案在于他的用户名…:使用正确的文字可以获得预期的19位精度!
cout.precision( 12 );