acm icpc — разница между 0-x и -x в переполнении стека

Я делаю 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/

-2

Решение

Если я перевожу эту страницу, то есть эта заметка, в которой говорится о Java, но, предположительно, то же самое относится и к решению C ++:

Обратите внимание, что при использовании Java для решения этой проблемы могут появиться x1 или x2. В случае -0 в это время отрицательный знак необходимо удалить.

-x а также 0-x может отличаться в IEEE-754, если x является 0.0:

  • -x будет -0.0
  • 0-x будет 0.0

Обратите внимание на отличительный знак.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector