我刚走过来,决定尝试一下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 / a
和x2 = 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)
归档时间: |
|
查看次数: |
2165 次 |
最近记录: |