为什么设置huge=1e9?while 的条件为什么这么设置?
#include <stdlib.h>
#include <stdio.h>
int main()
{
int T,n;
scanf("%d",&T);
int a[101];
double r,X,Y,Z,x;
long long huge=1e9;
for (int i=0;i<T;i++) {
scanf("%d\n",&n);
for (int j=1;j<=n+1;j++) {
scanf("%d",&a[j]);
}
double MIN=-1.0,MAX=1.0;
while ((MAX-MIN)*huge>1.0) {
r = (MIN+MAX)/2;
X = a[1]*-1;
x = 1 + MIN;
for (int k=2;k<=n+1;k++) {
X *= x;
X += a[k];
}
Y= a[1]*-1;
x = 1 + MAX;
for (int k=2;k<=n+1;k++) {
Y *= x;
Y += a[k];
}
Z= a[1]*-1;
x = 1 + r;
for (int k=2;k<=n+1;k++) {
Z *= x;
Z += a[k];
}
if (X*Z>0) {
MIN = r;
}else {
MAX = r;
}
}
r = (MIN+MAX)/2;
printf("case #%d:\n",i);
if ((r-0)*huge<1.0 && (r-0)*huge>-1.0) {
printf("0.0000%%\n");
}else {
printf("%.4f%%\n",r*100);
}
}
return 0;
}
为了防止rounding带来的误差导致错误的计算结果,例如
MAX=1.00000000001
MIN=1.0000000002
MAX-MIN=0.0000000001
rounding之后结果变为0(假设之保留小数点后9位)
如果先给结果乘以huge(1e9),那么rounding之前的结果变为0.1,rounding之后的结果也还是0.1,以此可以判断MAX和MIN不一样。
注:程序中通过和1.0来比较来判断MAX和MIN是否相等,你可以通过控制1.0来控制想要的精度。