gpt4 book ai didi

math - Ada 中的二次方程

转载 作者:行者123 更新时间:2023-12-04 02:59:52 26 4
gpt4 key购买 nike

我刚过来,决定尝试一些艾达。
缺点是语法和函数与 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;

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

最佳答案

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

求解标准公式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)

但是当 4 a c << b^2 , 计算 x1涉及减去接近的数字,并使您失去准确性,因此您可以使用以下内容
delta as above
x1 = 2 c / (-b - sqrt(delta)) (**)
x2 = 2 c / (-b + sqrt(delta))

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

因此,计算根的正确方法是
q = -0.5 (b + sign(b) sqrt(delta))

并使用 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;

关于math - Ada 中的二次方程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4503849/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com