10
votes

Équation quadratique à ADA

Je viens de venir autour et j'ai décidé d'essayer des ada. L'inconvénient est que la syntaxe et la fonction sont fausses de C ++. Donc, j'ai dû aimer Cram Divers substances pour que cette chose fonctionne.

Ma question est si il y a un meilleur moyen de faire ce calcul que ce que j'ai fait ici xxx < P> J'ai eu un problème avec des chiffres négatifs, c'est pourquoi j'ai fait une déclaration IF et utilisé ABS () pour les transformer en positif. Mais la chose étrange est que cela fonctionne parfaitement pour l'autre cas, qui est étrange ...


1 commentaires

En ce qui concerne les deux premières lignes - j'éviterais d'utiliser ABS () lorsque vous savez déjà que B est négatif. Utilisation B: = - B. Même si le compilateur est intelligent et peut aligner des choses.


5 Réponses :


1
votes

La formule quadratique est x = (-b +/- sqrt (b ** 2 - 4 * a * c) / (2 * a)

Je suppose que A est 1.

donc x = - (B / 2) +/- sqrt (((b ** 2) / 4) - c)

Calculer d = (b ** 2) * 0,25 - C puis vérifier son signe.

Si le signe de d est négatif, vous avez des racines complexes; les gérer comme vous le souhaitez.

Remplacement de - C avec + ABS (C) Si B se trouve être négatif vous donnera des ordures.

Multiplier généralement de 0,5 ou 0,25 est meilleur que la division de 2,0 ou 4.0.


0 commentaires

0
votes

Bien que je ne connaisse pas ADA, je vois des choses suivantes qui peuvent être optimisées:

  1. Dans la première branche du si instructiuon, vous savez déjà que B est négatif. Vous pouvez donc dire b: = -b au lieu de b: = abs (b) . Ou mieux: il suffit d'utiliser -b où vous avez utilisé B dans la première branche.
  2. Vous utilisez la sous-experte B / 2.0 quatre fois. Il pourrait être plus efficace (et aussi plus clair) d'attribuer b / 2.0 à une variable auxiliaire b_2 (ou attribuez-le à B si Vous ne voulez pas dépenser une autre variable) et l'utiliser à la place.
    De plus, le sqrt est calculé deux fois. L'affectation à une variable auxiliariy enregistre l'exécution (et le rend explicite au lecteur qui est exactement utilisé à deux reprises la même sous-expression).
  3. qu'il ne serait probablement pas plus rapide d'utiliser b_2 * b_2 au lieu de ** 2.0 ; Mieux vaut mieux utiliser une fonction carrée dédiée, s'il y en a un à ADA.

0 commentaires


22
votes

La résolution d'équations quadratiques n'est pas aussi simple que la plupart des gens pensent.

La formule standard pour la résolution ax ^ 2 + bx + c = 0 code> est p> xxx Pré>

mais lorsque 4 AC , l'informatique x1 code> implique de soustraire des nombres fermés et vous permet de perdre de précision, de sorte que vous utilisez ci-après p> xxx pré>

qui donne un meilleur x1, mais dont le X2 a le même problème que x1 avait ci-dessus. p>

Le moyen correct de calculer les racines est donc p > xxx pré>

et utilisez x1 = q / a code> et x2 = c / q code>, que je trouve très efficace. Si vous souhaitez gérer le cas lorsque delta ​​code> est négatif ou des coefficients complexes, vous devez utiliser une arithmétique complexe (qui est assez délicate pour aller à droite aussi). P>

EDIT: Code ADA: P>

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;


1 commentaires

Belle explication! C'est un excellent exemple de la raison pour laquelle la formule de manuels standard pour quelque chose peut ne pas être le meilleur guide pour la rédaction de code.



-1
votes

Pour moi, la question est plus liée à l'algorithme numérique qu'à la langue de l'ADA. Comme toujours avec le calcul numérique, il faut souvent (sinon -always-) se référer à des documents de référence / académiques.

Ces questions monétaires me rappellent toujours cela: https://fr.wikipedia.org/wiki/fast_inverse_square_root

Vous ne pouvez trouver que les astuces suivantes si vous "faites les maths" ou trouver du papier qui adresse votre problème. xxx

PS: Comme l'article WikiePDIA indique, cette mise en œuvre est probablement obsolète pour la plupart des plates-formes maintenant


0 commentaires