Analyse de Code

Ci-dessous, tu peux voir un des autres programmes compliqués de la souris Stofl (en versions C++, Pascal et Python – toutes identiques). La fonction algorithm exécute une opération mathématique. Ta tâche est de trouver ce que cette fonction calcule et, ce qui est plus important, pourquoi elle calcule ce que tu prétends. Tu devrais aussi réfléchir si cette fonction marche toujours ou s'il doit y avoir des restrictions quant à la valeur de input et de la valeur initiale de output.

C'est une tâche théorique et il n'est pas nécessaire d'écrire de code source, mais tu dois soumettre une solution sous forme de texte. Si tu penses que ceci rendra tes explications plus claires, tu peux quand même ajouter un (pseudo)code.

Tu peux supposer que la valeur de input est un nombre réel non-négatif.

C++ version

#include <cmath>
 
double algorithm(double input) {
  double output = 100.0, change = 2.0;
  const double eps = 0.0000001;
  const double magic = 0.69314718056;
  while(fabs(change - 1.0) > eps) {
    change = input/pow(2.0,output);
    output -= (1.0-change)/magic;
  }
  return output;
}

Pascal version

Uses Math;
 
function algorithm (input : double) : double;
var change, eps, magic : double;
begin
   algorithm := 100.0;
   eps := 0.0000001;
   change := 2.0;
   magic := 0.69314718056;
   while abs(change - 1.0) > eps do
   begin
      change := input/power(2.0,algorithm);
      algorithm := algorithm - (1.0 - change)/magic;
   end
end;

Python version

from math import fabs, pow
 
def algorithm(input):
    output, eps, change, magic = 100.0, 0.0000001, 2.0, 0.69314718056
    while fabs(change - 1.0) > eps:
        change = input/pow(2,output)
        output -= (1.0-change)/magic
    return output

Remarques

Le programme de Stofl utilise des opérations mathématiques pour la valeur absolue et pour les puissances. Plus précisément, la fonction C++ fabs(x), la fonction Pascal abs(x) et la fonction Python fabs(x) calculent toutes la valeur suivante: \begin{align*} \lvert x\rvert = \cases{x, &\text{ si } x\geq 0 \cr -x &\text{ autrement}} \end{align*}

De plus, la fonction C++ pow(2, x), la fonction Pascal power(2, x) et la fonction Python pow(2, x) calculent toutes $2$ à la puissance $x$, c'est-à-dire elles calculent la valeur \begin{align*} 2^x. \end{align*} Prends note que dans notre exemple, les valeurs de $x$ ne sont pas nécessairement entières et $x$ peut être n'importe quel nombre entier tel que $8.25612$ par exemple.

Corrections

  • 1 Octobre: Valeur initiale de la variable output dans la texte source Python était 1.0 à la place de 100.0.

Envoi