计算错误双

Incorrect calculation double

我有一些 C# 应用程序:

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

在我的情况下,M==7,d==27,n=55。我用Windows默认计算器计算,得到28。但是我的应用returns14。为什么?

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

可以使用(a^b) % N((a%n) ^ b) % n相同的数学事实,但您仍然[=27] =] 下雨的数字大于 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

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

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