Я делаю ACM, но возникла одна проблема. Я просто хочу знать, почему это неправильный ответ при использовании part1 = (-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
Обратите внимание на отличительный знак.
Других решений пока нет …