Daniel Thoma: C++: Register Überlauf beim Rechnen abfangen

Beitrag lesen

Hallo Tom,

Eine Alternative zum Abfangen eines Fehlers ist ja immer die Prognose eines Fehlers, man kann also so etwas machen:

  
function factorial(x) {  
  var result = 1;  
  var limit = Math.pow(2, 32) - 1; // Oder was auch immer das Limit ist, evtl. gibt es da auch eine Konstante  
  for (var i = 2; i <= x; ++i) {  
    if (i >= limit) {  
      return 0; // Fehler  
    }  
    limit /= i;  
    result *= i;  
  }  
  return result;  
}  

Das Programm beruht auf der Idee, dass a * b < c => a < c/b (für b > 0).
Man muss evtl. noch darüber nachdenken, welche Rolle die Verwendung der Integer-Division spielt. Außerdem kann man in diesem Fall natürlich einfach das Limit für x statisch ausrechnen, was sicher sinnvoller ist.

Grüße

Daniel