2008-09-17 14 views

cevap

3

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.

1

Kodumda aralık/geçerlilik denetimi yapmak için çok fazla test kodu yazarım. Bu, bu tür durumların çoğunu yakalama eğilimindedir ve kesinlikle daha fazla kurşun geçirmez kod yazmam için bana yardımcı olur. Bir long double gibi kayan nokta sayıları

1

kullanın yüksek hassasiyet.

+0

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

1

Sana Listenizde çok önemli bir seçenek eksik düşünüyorum: iş için doğru programlama dilini seçin. Bu problemlere sahip olmayan birçok programlama dili vardır, çünkü sabit boyutlu tamsayıları yoktur.

0

Kullandığınız dili tamsayı büyüklüğünden seçerken daha önemli hususlar vardır. Değerin sınırlar içinde olup olmadığını bilmiyorsanız girişinizi kontrol edin veya vaka çok nadir ise istisna işlemlerini kullanın. tutarsızlıklar denetler

0

bir sarıcı birçok durumda mantıklı olacaktır. İki veya daha fazla tamsayıda bir ek işlem (yani toplama veya çarpma), işlenenlerden daha küçük bir değere neden oluyorsa, bir şeyler yanlış gittiğini bilirsiniz. Her ilave bir operasyon, takip etmelidir

if (sum < operand1 || sum < operand2) 
    omg_error(); 

Aynı şekilde mantıksal yanlışlıkla embiggin'd gelip gelmediğini kontrol edilmelidir küçük bir değere neden gereken herhangi çalışma.

0

Taşmadığından emin olmak için kodunuzu kontrol etmek için resmi yöntemlerin kullanımını araştırdınız mı? Soyut yorumlama olarak bilinen resmi bir yöntem tekniği, yazılımınızın taşma, taşma, sıfıra, taşma veya diğer benzer çalışma zamanı hatalarına maruz kalmayacağını kanıtlamak için yazılımınızın sağlamlığını kontrol edebilir. Yazılımınızı kapsamlı bir şekilde analiz eden matematiksel bir tekniktir. Teknik 1970'lerde Patrick Cousot tarafından öncülük edildi.Arian 5 roketinde, taşma aracının tahrip edilmesine neden olan taşma durumunun teşhisinde başarılı bir şekilde kullanılmıştır. Kayan nokta sayısı bir tam sayıya dönüştürülürken taşma meydana geldi. Bu teknik hakkında daha fazla bilgiyi here ve ayrıca Wikipedia numaralı telefondan bulabilirsiniz.

İlgili konular