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
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
Neden toplam sırasını değiştirerek far...
Nasıl kullanıcı duruyorsun.farklı derl...
Farklı telefonlarda boyutu Android yığ...
KitKat verir farklı Android Galeri Niy...
Farklı döküm operatörü farklı Derleyic...