napisałem program wliczający równanie trzeciego stopnia z liczbami zespolonymi (metoda cardano)no i wszystko ok ale pierwiastki są źle wliczane błąd tkwi moim zdanie że liczenie odbywa się na ułamkach dziesiętnych a nie na zwykłych (za dużo miejsc po przecinku ). Tzn zamiast np. 1/9 liczy liczbę 0,11111111111111111111111111111111 no i po każdym następnym obliczeniu błąd się powiększa . Macie może jakiś pomysł ?? dodam że po podstawieni 3 jedynek powinien pokazać x1 1 x2 i x3 -i
a pokazuje x1 0.694923.... x2 -0.847461...... x3 -0.847461......
void __fastcall TForm1::Button1Click(TObject *Sender)
{
double a,b,c,d,p,q,D;
a=StrToFloat(LabeledEdit1->Text);
b=StrToFloat(LabeledEdit2->Text);
c=StrToFloat(LabeledEdit3->Text);
d=StrToFloat(LabeledEdit4->Text);
if(a==0){
//ShowMessage(test);
}else
{
p=(((2.0*a*c)-(b*b))/(3.0*a*a))/3.0;
q=(((2.0*b*b*b)/(27.0*a*a*a))-((b*c)/(3.0*a*a))+(d/a))/2.0;
Label13->Caption=FloatToStr(p);
Label14->Caption=FloatToStr(q);
D=q*q+p*p*p;
Label16->Caption=FloatToStr(D);
complex <double> u,v,j(0.0,1.0);
double sqrtD=pow(fabs(D),0.5);
if(D>=0){
if(-q+sqrtD>=0) {u=pow(-q+sqrtD,1.0/3.0);}else {u=pow(fabs(-q+sqrtD),1.0/3.0);}
if(-q-sqrtD>=0) {v=pow(-q-sqrtD,1.0/3.0);}else {v=pow(fabs(-q-sqrtD),1.0/3.0);}
}else{
u=pow(-q+j*sqrtD,1.0/3.0);
v=pow(-q-j*sqrtD,1.0/3.0);
}
complex <double> e1,e2,x1,x2,x3;
e1=0.5*(-1.0+j*sqrt(3.0));
e2=0.5*(-1.0-j*sqrt(3.0));
x1=u+v-b/a/3.0;
x2=u*e1+v*e2-b/a/3.0;
x3=u*e2+v*e1-b/a/3.0;
Label20->Caption=FloatToStr(x1.real());
Label21->Caption=FloatToStr(x2.real());
Label22->Caption=FloatToStr(x3.real());
Label26->Caption=FloatToStr(x1.imag());
Label27->Caption=FloatToStr(x2.imag());
Label28->Caption=FloatToStr(x3.imag());
double F1=abs(a*x1*x1*x1+b*x1*x1+c*x1+d);
double F2=abs(a*x2*x2*x2+b*x2*x2+c*x2+d);
double F3=abs(a*x3*x3*x3+b*x3*x3+c*x3+d);
Edit5->Text=FloatToStr(F1/*,ffExponent,5,3*/);
Edit6->Text=FloatToStr(F2/*,ffExponent,5,3*/);
Edit7->Text=FloatToStr(F3/*,ffExponent,5,3*/);