计算错误双
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;
我有一些 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;