计算错误加倍

时间:2015-11-10 21:10:18

标签: c# c#-4.0 double

我有一些C#应用程序:

double n = p * q;
double S = Math.Pow(M, d) % n;

在我的情况下,M == 7,d == 27,n = 55.我在Windows默认计算器中计算它,得到28.但是我的应用程序返回14.为什么?

2 个答案:

答案 0 :(得分:4)

double最多具有16位精度,但7^27是一个23位数字,因此您在求幂中失去精度。 Windows计算器支持超越函数的32位精度(如pow),因此它可以在不损失精度的情况下执行计算。

可以使用(a^b) % N((a%n) ^ b) % n相同的数学事实,但你下雨的数字更大然后是2到27的幂,它不能在double中精确表示。

另一种选择是将权力分成多个指数,可以<{>}在double中表示,而不会损失精确度:

     7^27 = 7^9 * 7^9 * 7^9
7^27 % 55 = ((7^9) % 55 * (7^9) % 55 * (7^9) % 55) % 55
          = (52 * 52 * 52) % 55
          = 140,608 % 55
          = 28

答案 1 :(得分:4)

正如D Stanley所提到的,double只有16位精度。您需要使用BigInteger。这是在.NET 4.5和4.6中。您需要添加对System.Numerics

的引用
BigInteger test = BigInteger.Pow(7, 27) % 55;