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 P>
5 Réponses :
La formule quadratique est Je suppose que A est 1. P>
donc Calculer Si le signe de Remplacement de Multiplier généralement de 0,5 ou 0,25 est meilleur que la division de 2,0 ou 4.0. P> x = (-b +/- sqrt (b ** 2 - 4 * a * c) / (2 * a) code> p>
x = - (B / 2) +/- sqrt (((b ** 2) / 4) - c) code> p>
d = (b ** 2) * 0,25 - C code> puis vérifier son signe. P>
d code> est négatif, vous avez des racines complexes; les gérer comme vous le souhaitez. P>
- C code> avec
+ ABS (C) code> Si
B code> se trouve être négatif vous donnera des ordures. P>
Bien que je ne connaisse pas ADA, je vois des choses suivantes qui peuvent être optimisées: p>
si code> instructiuon, vous savez déjà que B code> est négatif. Vous pouvez donc dire b: = -b code> au lieu de b: = abs (b) code>. Ou mieux: il suffit d'utiliser -b code> où vous avez utilisé B code> dans la première branche. li>
- Vous utilisez la sous-experte
B / 2.0 code> quatre fois. Il pourrait être plus efficace (et aussi plus clair) d'attribuer b / 2.0 code> à une variable auxiliaire b_2 code> (ou attribuez-le à B code> si Vous ne voulez pas dépenser une autre variable) et l'utiliser à la place.
De plus, le sqrt code> 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). li>
- qu'il ne serait probablement pas plus rapide d'utiliser
b_2 * b_2 code> au lieu de ** 2.0 code>; Mieux vaut mieux utiliser une fonction carrée dédiée, s'il y en a un à ADA. Li>
ol>
Proche; Tous les chiffres devront être réels (4,0 dans la première ligne, 0,0 dans le second, 2,0 au cours des troisième et quatrième). En outre, il n'est pas nécessaire de mettre des crochets autour de l'expression conditionnelle; si d <= 0.0 puis code>.
La résolution d'équations quadratiques n'est pas aussi simple que la plupart des gens pensent.
La formule standard pour la résolution mais lorsque 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 > et utilisez EDIT: Code ADA: P> ax ^ 2 + bx + c = 0 code> est p>
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>
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>
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;
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.
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 P>
Vous ne pouvez trouver que les astuces suivantes si vous "faites les maths" ou trouver du papier qui adresse votre problème. P> PS: Comme l'article WikiePDIA indique, cette mise en œuvre est probablement obsolète pour la plupart des plates-formes maintenant p> p>
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.