このサイトは三次方程式を解き、使用する方程式を持っています
同じ結果を得るためにこの関数を書きましたが、機能していません
void cubicFormula(float a, float b, float c, float d, float *results)
{
float a2 = a*a;
float b2 = b*b;
float b3 = b2*b;
float q = (3*c- b2)/9;
float q2 = q*q;
float q3 = q2*q;
float r = -27*d + b*(9*c-2*b2);
float r2 = r*r;
float discriminant = q3 + r2;
float s = r + sqrtf(discriminant);
float t = r - sqrtf(discriminant);
float term1 = powf((-t + s)/2, 1/3.);
float r13= 2 * sqrtf(q);
results[0] = (- term1 + r13 * cosf(q3/3));
results[1] = (- term1 + r13 * cosf(q3 + (2*M_PI)/3));
results[2] = (- term1 + r13 * cosf(q3 + (4*M_PI)/3));
}
何が問題なのですか、私が見逃しているものはありますか?
アップデート:
たとえば、これらの値を使用して
a = -1.000000;
b = 36.719475;
c = -334.239960;
d = 629.877808;
判別式はゼロより小さいため、r13はnanです。
しかし、上記のサイトと、私がテストしたいくつかのオンライン ソルバーでは、3 つのルートが見つかりました。
23.775687816485593
2.548516232734247
10.395270950780164
いずれも実数