双变量的精度仅为十点后的2个位置
Double variable has precision of only 2 places after decimal point
我正在求解一个问题,该问题找到一个值k,该值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;
}
}
}
考虑以下输入:17390 8573 9287 285
在一定数量的迭代后," 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;
}
}
}
输入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
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 如何在C++中从两个单独的for循环中添加两个数组
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 处理多个异常集合的C++方法
- 什么时候在C++中返回常量引用是个好主意
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 尝试通过多个向量访问变量时,向量下标超出范围
- Ardunio UNO解决了多个重叠的定时器循环
- 如何返回一个类的两个对象相加的结果
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 数到第n个楼梯的路(顺序无关紧要)
- 基于多个条件处理地图中的所有元素
- 为多个会话保留XPtr
- 如何在C++中初始化嵌套类中的2个memeber
- 运算符C++ "delete []"仅删除 2 个前值
- 双变量的精度仅为十点后的2个位置