bir olasılık keyfi si olan bir dil kullanmaktır) bunu engellemez Asla taşmayan/taşan zed tamsayıları.
Aksi takdirde bu şey ise, gerçekten endişeleniyorsanız ve dil izin veriyorsa, bir sarıcı bir tamsayı gibi davranır sınıfı, ancak çekleri taşma için her operasyon yazın. Hata ayıklama yapılarının kontrolünü bile yapabilir ve sürüm oluşturma için optimize edilmiş şeyleri bırakabilirsiniz. C++ gibi bir dilde, bunu yapabilirdiniz ve sürüm oluşturma için bir tamsayı gibi davranacaktı, ancak hata ayıklama için tam çalışma zamanı kontrolüne sahip olursunuz.
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...
};
Düzenleme:
birisi doing this already for C++ Meğer - şu anki uygulama Visual Studio için odaklanmıştır, ancak onlar da gcc için destek alıyoruz gibi görünüyor.
Kayan nokta (herhangi bir hassasiyetle), daha hassas bir sorun sınıfı, yani hassasiyet kaybı sağlar. Yani '(x + 1.0) -x! = 1'. 'Uzun çifte 'yi kullanmak sadece frekansı ve büyüklüğü azaltır. – MSalters