SORU
31 Ocak 2014, Cuma


Mod operatörü (%) farklı farklı bir sonuç verir .C NET sürümleri#

Şifre için bir dize oluşturmak için kullanıcının giriş şifreleme ediyorum. Ama bir kod satırı çerçeve farklı sürümlerinde farklı sonuçlar verir. Anahtar kullanıcı tarafından basıldığında değer ile kısmi kod:

Basılı: 1. 5* *değişken 49. Değeri 'A' ve 'n' bazı hesaplama sonra: . e

e = 103, 
n = 143,

Math.Pow(ascii, e) % n

Yukarıdaki kod sonucu:

  • .NET 3.5 (C#)

    Math.Pow(ascii, e) % n
    

    verir 9.0.

  • .(C#) NET 4

    Math.Pow(ascii, e) % n
    

    verir 77.0.

Math.Pow() her iki versiyonda da (aynı) doğru sonuç verir.

Nedeni ve Çözümü nedir?

CEVAP
31 Ocak 2014, Cuma


Math.Pow çift duyarlıklı kayan nokta sayıları; böylece, daha kesin sonuç first 15–17 digits daha fazla beklememek gerekir: çalışıyor

Kayan noktalı tüm sayılar aynı zamanda da bir kayan nokta değeri gerçek bir sayı yaklasik nasıl belirleyen önemli basamak sayısı sınırlıdır. Double değeri 17 basamak DAHİLİ olarak korunur, ancak hassas 15 ondalık basamak vardır.

Ancak, aritmetik tüm rakamları doğru olmasını gerektirir. Sizin durumunuzda, 49 bilgisayar103175 haneden oluşmaktadır olan , modül yapma operasyonu cevaplarınız anlamsız.

BigInteger sınıfı tarafından sağlanan doğru değer, keyfi hassas aritmetik kullanmanız gerekir, çalışmak (tanıtıldı .NET 4.0).

int val = (int)(BigInteger.Pow(49, 103) % 143);   // gives 114

Edit: Aşağıdaki yorum Mark Peters tarafından belirttiği gibi, bu tür bir işlem için özel olarak tasarlanmış BigInteger.ModPow yöntemi kullanmalısınız

int val = (int)BigInteger.ModPow(49, 103, 143);   // gives 114

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • InfinityWard

    InfinityWard

    19 EYLÜL 2006
  • Muse

    Muse

    28 EYLÜL 2006
  • Rickymon Tero

    Rickymon Ter

    1 Ocak 2007