разница между 0-x и -x в c ++ - PullRequest
       24

разница между 0-x и -x в c ++

0 голосов
/ 24 сентября 2018

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

1 Ответ

0 голосов
/ 24 сентября 2018

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

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

-x и 0-x могут отличаться в IEEE-754, если xравно 0.0:

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

Обратите внимание на отличающийся знак.

...