Eine Möglichkeit ist, eine Sprache zu verwenden, die beliebig si hat zed Ganzzahlen, die niemals über-/unterlaufen.
Andernfalls sollten Sie sich wirklich Sorgen machen, und wenn Ihre Sprache dies zulässt, schreiben Sie eine Wrapper-Klasse, die sich wie eine Ganzzahl verhält, aber jede Operation auf Überlauf prüft. Sie könnten sogar die Überprüfung von Debug-Builds durchführen lassen und die Dinge für Release-Builds optimiert lassen. In einer Sprache wie C++ könnten Sie dies tun, und es würde sich fast genau wie ein Integer für Release-Builds verhalten, aber für Debug-Builds würden Sie eine vollständige Laufzeitprüfung erhalten.
class CheckedInt
{
private:
int Value;
public:
// Constructor
CheckedInt(int src) : Value(src) {}
// Conversions back to int
operator int&() { return Value; }
operator const int &() const { return Value; }
// Operators
CheckedInt operator+(CheckedInt rhs) const
{
if (rhs.Value < 0 && rhs.Value + Value > Value)
throw OverflowException();
if (rhs.Value > 0 && rhs.Value + Value < Value)
throw OverflowException();
return CheckedInt(rhs.Value + Value);
}
// Lots more operators...
};
Edit:
Stellt sich heraus, jemand ist doing this already for C++ - die aktuelle Implementierung für Visual Studio konzentriert, aber es sieht aus wie sie Unterstützung auch für gcc zu bekommen.
Fließkomma (mit jeder Genauigkeit) führt eine noch härtere Klasse von Problemen ein, nämlich den Verlust der Genauigkeit. I.e. '(x + 1.0) -x! = 1'. Die Verwendung von "long double" reduziert lediglich die Frequenz und die Größe. – MSalters