[英]difference between 0-x and -x in c++
我正在做 ACM,但出现了一个问题。 我只想知道为什么在使用part1 = (-b)/ (2 * a);
时它是错误的答案part1 = (-b)/ (2 * a);
,但在使用part1 = (0-b)/ (2 * a);
时被接受part1 = (0-b)/ (2 * a);
#include <cstdio>
#include <cmath>
int main()
{
int n;
scanf("%d",&n);
while(n--){
double a,b,c;
double pd;
double part1,part2;
scanf("%lf %lf %lf",&a,&b,&c);
if (a < 0){
a = 0 - a;
b = 0 - b;
c = 0 - c;
}
pd=b*b-4*a*c;
part1 = (0-b)/ (2 * a);
if(pd>0){
part2 = sqrt(pd)/(2 * a);
printf("x1=%.5lf;x2=%.5lf\n",part1+part2,part1-part2);
}else if(fabs(pd)<1e-8){
printf("x1=x2=%.5lf\n",part1);
}else{
part2 = sqrt(-pd)/ (2 * a);
printf("x1=%.5lf+%.5lfi;x2=%.5lf-%.5lfi\n",part1,part2,part1,part2);
}
}
return 0;
}
输入:
3
1.0 3.0 1.0
2.0 -4.0 2.0
1.0 2.0 8.0
输出:
x1=-0.38197;x2=-2.61803
x1=x2=1.00000
x1=-1.00000+2.64575i;x2=-1.00000-2.64575i
而源码问题在这里: http : //bailian.openjudge.cn/practice/2707/
如果我翻译了那个页面,就会看到这个关于 Java 的注释,但据说这同样适用于 C++ 解决方案:
注意在用Java做这个问题的时候,可能会出现x1或者x2为-0的情况,这时候需要去掉负号。
-x
和0-x
在 IEEE-754 中可能不同,如果x
是0.0
:
-x
将为-0.0
0-x
将是0.0
注意不同的符号。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.