Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.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++ 双变量的精度仅为小数点后2位_C++ - Fatal编程技术网

C++ 双变量的精度仅为小数点后2位

C++ 双变量的精度仅为小数点后2位,c++,C++,我正在解决一个问题,找到一个精确到4个小数点的值k。我已将k初始化为双精度。但是,它仅在小数点后2位。我想知道这种奇怪行为背后的原因 我尝试了不同的数字,试图理解为什么会发生这种情况,但没有成功 #include <bits/stdc++.h> using namespace std; double calc_err(double x, double y, double z, double a, double k) { return ((y*y)/((z-k)*(z-k)

我正在解决一个问题,找到一个精确到4个小数点的值k。我已将k初始化为双精度。但是,它仅在小数点后2位。我想知道这种奇怪行为背后的原因

我尝试了不同的数字,试图理解为什么会发生这种情况,但没有成功

#include <bits/stdc++.h>

using namespace std;

double calc_err(double x, double y, double z, double a, double k)
{
    return ((y*y)/((z-k)*(z-k)) - (a*a*x*x)/(k*k) - (a*a) + 1.0);
}

int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        double x, y, z, a;
        cin >> x >> y >> z >> a;

        double cerrp = 100.0;
        double hi = z;
        double lo = 0;
        while(1)
        {
            cout << "cerrp : " << cerrp << endl;
            double k  = (hi + lo)/2;
            if (cerrp  < 0.00005 && cerrp >= 0.0 )
            {
                cout << "k final : " << k << endl;
                break;
            }
            cout << "hi : " << hi << endl;
            cout << "lo : " << lo << endl;
            cout << "k : " << k << endl;
            cerrp = calc_err(x, y, z, a, k);
            if (cerrp >= 0) hi = k;
            else lo = k;


        }
    }
}
考虑以下输入: 1. 739085739287285

经过一定次数的迭代后,hi的值为9263.49,lo的值为9263.48。因此,我希望k的值为hi+lo/2=9263.485,但它的值为9263.49。 此外,请注意,即使k不改变,cerrp也会不断变化,所有其他参数都是常数。为什么会这样

编辑:这与
因为我的问题与显示变量时的精度有关,而链接中的问题与浮点运算固有的不精确性有关。

打印时只需使用std::setprecision获取更多数字即可

比如

int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        double x, y, z, a;
        cin >> x >> y >> z >> a;

        double cerrp = 100.0;
        double hi = z;
        double lo = 0;
        while(1)
        {
            cout << "cerrp : " << std::setprecision(10) <<cerrp << endl;
            double k  = (hi + lo)/2;
            if (cerrp  < 0.00005 && cerrp >= 0.0 )
            {
                cout << "k final : " << std::setprecision(10) << k << endl;
                break;
            }
            cout << "hi : " << std::setprecision(10) << hi << endl;
            cout << "lo : " << std::setprecision(10) << lo << endl;
            cout << "k : " << std::setprecision(10) << k << endl;
            cerrp = calc_err(x, y, z, a, k);
            if (cerrp >= 0) hi = k;
            else lo = k;


        }
    }
}

当您谈到“k”的值时,您是指在调试器中存储在变量中的值,还是调用std::cout时显示的内容?这是两件截然不同的事情。双精度小数点前后都没有小数位数。它有二进制数字,而这两个数字是不可公度的。精度是用有效数字而不是小数来衡量的。默认输出格式精度为六位有效数字。
cerrp : 100
hi : 9287
lo : 0
k : 4643.5
cerrp : -286945.888
hi : 9287
lo : 4643.5
k : 6965.25
cerrp : -172643.8308
hi : 9287
lo : 6965.25
k : 8126.125
cerrp : -148345.0696
hi : 9287
lo : 8126.125
k : 8706.5625
...
hi : 9263.485111
lo : 9263.485111
k : 9263.485111
cerrp : -8.219334995e-05
hi : 9263.485111
lo : 9263.485111
k : 9263.485111
cerrp : 1.337719732e-05
k final : 9263.485111