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

  • MrSuicideSheep

    MrSuicideShe

    9 NİSAN 2010
  • My Name Is Jeff

    My Name Is J

    26 ŞUBAT 2008
  • NikkoNantone

    NikkoNantone

    21 Kasım 2011