Code giải phương trình bậc 2 bị sai kết quả

E có viết một pt bậc hai như vầy ạ, khi thử giá trị a=-2,b=-2,c=0 thì ra nghiệm x2 =-0, cho e hỏi vì sao nó ra như vậy ạ

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main ()

{printf ("dien gia tri a, b, c:\n");
    float a, b, c;
float denta, dentano2;
scanf ("%f %f %f", &a, &b, &c);
denta = b*b - 4*a*c;
dentano2 = sqrt(denta);

{
 float x1, x2;
 if (a != 0)
 {
   if (denta > 0)
   {x1 = (-b + dentano2)/ (2*a);
    x2 = (-b - dentano2)/ (2*a);
   {if (x2==-0)
   printf ("nghiem x1 = %.3f\n nghiem x2 = 0", x1);
   else
    printf ("nghiem x1 = %.3f\n nghiem x2 = %.3f", x1, x2);
    }}
   else if (denta == 0)
       {x1 = x2 = -b/(2*a);
    printf ("nghiem x1 = x2 = %.3f", x1);}
    else
    {printf ("phuong trinh nay vo nghiem");}
 }
 else
 {
  if (b != 0)
  {x1 = -c/b;
  printf ("pt khuyet a co nghiem x la %.3f", x1);}
  else
  {
     if (c == 0)
        printf ("phuong trinh co vo so nghiem");
     else
        printf ("phuong trinh vo nghiem");
  }
 }
}


return 0;
}

Chắc tùy theo trình biên dịch mà nó in ra -0 hoặc 0.
Lý do nó bằng -0 vì nó bằng 0 (dấu cộng) chia cho 1 số âm (dấu trừ) (-2+2)/(2*(-2))=0/-4=-0
Vì số thực dấu chấm động có 1 bit dấu (sign bit) để biểu diễn số đó là âm hoặc dương. Khi tính toán thì (nhân, chia) thì bit đó cũng sẽ được gán giá trị dựa vào dấu của 2 tham số. Khi nhân hoặc chia 2 số trái dấu thì kết quả luôn là dấu trừ.

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?