Code-Analyse

Unten findest du eines von Stofls kompliziertesten Programmen, als C++, Pascal und Python Version – alle identisch. Die Funktion algorithm berechnet eine mathematische Operation. Deine Aufgabe ist es nun herauszufinden, was die Funktion genau berechnet und warum sie es berechnet. Desweiteren sollst du dir überlegen, ob die Funktion immer funktioniert oder ob für die Werte der Variablen input und output bestimmte Bedingungen erfüllt sein müssen.

Das ist eine theoretische Aufgabe und es wird kein Programmiercode verlangt, du solltest viel mehr deine Lösung in Worten und Formeln erklären. Du kannst jedoch, falls du das willst, (Pseudo)code verwenden um deine Erklärungen zu erläutern.

Du kannst davon ausgehen, dass der Wert der Variable input eine nicht-negative reelle Zahl ist.

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

Bemerkungen

Stofl's Programm benutzt die mathematischen Funktionen für den Absolutwert und die Potenzfunktion. Genauer gesagt kannst du davon ausgehen, dass die C++ Funktion fabs(x), die Pascal Funktion abs(x) und die Python Funktion fabs(x) alle folgenden Wert berechnen: \begin{align*} \lvert x\rvert = \cases{x, &\text{ falls } x\geq 0 \cr -x &\text{ sonst}} \end{align*}

Desweiteren berechnet die C++ Funktion pow(2, x), die Pascal Funktion power(2, x) und die Python Funktion pow(2, x) den Wert $2$ hoch $x$, also: \begin{align*} 2^x. \end{align*} Merke, dass bei uns die Werte von $x$ nicht zwingend ganze Zahlen sein müssen, sondern beliebige reelle Zahlen, wie zum Beispiel $8.25612$ sein können.

Korrekturen

  • 1. Oktober: Der Anfangswert der Variable output im Python Quelltext war versehentlich auf 1 anstatt auf 100 gesetzt.

Einsendung