我正在解决一个问题,该问题找到的值k正确至小数点后4位。我已将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个 7390 8573 9287 285
经过一定数量的迭代后,“ hi”取值9263.49,“ lo”取值9263.48。因此,我希望“ k”取值(hi + lo)/ 2 = 9263.485,但取值9263.49。 另外,请注意,即使“ k”未更改(所有其他参数均不变),“ cerrp”仍会继续更改。为什么会这样?
编辑:这与Is floating point math broken?不同 因为我的问题与变量显示时的精度有关,而链接中的问题与浮点运算的固有错误有关。
答案 0 :(得分:1)
打印时只需使用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;
}
}
}
使用输入1 7390 8573 9287 285
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