Ada中的二次方程

sta*_*orn 10 math ada

我刚走过来,决定尝试一下Ada.缺点是语法和功能远离C++.所以我不得不喜欢各种各样的东西让这件事情起作用.

我的问题是,如果有更好的方法来做这个计算,我在这里做了什么

   IF(B < 0.0) THEN
      B := ABS(B);
      X1 := (B / 2.0) + Sqrt( (B / 2.0) ** 2.0 + ABS(C));
      X2 := (B / 2.0) - Sqrt( (B / 2.0) ** 2.0 + ABS(C));
   ELSE
      X1 := -(B / 2.0) + Sqrt( (B / 2.0) ** 2.0 - C);
      X2 := -(B / 2.0) - Sqrt( (B / 2.0) ** 2.0 - C);
   END IF;
Run Code Online (Sandbox Code Playgroud)

我有一些负数的问题,这就是为什么我做了一个IF语句并使用ABS()将它们转为正数.但奇怪的是它适用于另一种情况,这很奇怪......

Ale*_* C. 19

求解二次方程并不像大多数人想象的那么简单.

解决的标准公式a x^2 + b x + c = 0

delta = b^2 - 4 a c
x1 = (-b + sqrt(delta)) / (2 a)   (*)
x2 = (-b - sqrt(delta)) / (2 a)
Run Code Online (Sandbox Code Playgroud)

但是,当4 a c << b^2计算x1涉及减去紧密数字并使你失去准确性时,所以你使用以下代码

delta as above
x1 = 2 c / (-b - sqrt(delta))     (**)
x2 = 2 c / (-b + sqrt(delta))
Run Code Online (Sandbox Code Playgroud)

这产生了更好的x1,但其x2与x1具有相同的问题.

因此,计算根的正确方法

q = -0.5 (b + sign(b) sqrt(delta))
Run Code Online (Sandbox Code Playgroud)

并使用x1 = q / ax2 = c / q,我觉得这非常有效.如果你想处理delta负数或复数系数的情况,那么你必须使用复杂的算术(这也很难得到正确).

编辑:使用Ada代码:

DELTA := B * B - 4.0 * A * C;

IF(B > 0.0) THEN
    Q := -0.5 * (B + SQRT(DELTA));
ELSE
    Q := -0.5 * (B - SQRT(DELTA));
END IF;

X1 := Q / A;
X2 := C / Q;
Run Code Online (Sandbox Code Playgroud)