首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我要使用大整数(System.Numerics)获得系统溢出?

为什么我要使用大整数(System.Numerics)获得系统溢出?
EN

Stack Overflow用户
提问于 2021-04-20 20:29:57
回答 2查看 227关注 0票数 2

我得到了一个错误: System.OverflowException:‘这个值不是一个数字。’我的印象是大整数可以存储任何大小的值(在本例中是500 ^500),所以我不明白为什么会发生这种情况。

代码语言:javascript
复制
public int decode(int code)
{
   int totient = (p - 1) * (q - 1);
   int d = modInverse(e, totient);
   int pq = p * q;
   BigInteger decodedMessage = new BigInteger(Math.Pow(code, d) % pq);
   return (int)decodedMessage;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-20 20:37:39

代码语言:javascript
复制
BigInteger decodedMessage = new BigInteger(Math.Pow(code, d) % pq);

Math.Pow(code, d) % pq不是BigInteger,它是double类型的表达式。在计算完成(并且已经溢出)之前,将结果转换为BigInteger不会有效果。

Math.Pow可以很容易地溢出到大数字的Double.PositiveInfinity,而Double.PositiveInfinity % someNumber产生Double.NaN。调用new BigInteger(Double.NaN)将产生您所描述的错误。

您需要使用BigInteger进行计算。幸运的是,有一种方法就是为了达到这个目的(BigInteger.ModPow):

代码语言:javascript
复制
BigInteger decodedMessage = BigInteger.ModPow(code, d, pq);

(BigInteger.ModPow需要BigInteger参数,但是有从int到BigInteger的隐式转换。)

票数 6
EN

Stack Overflow用户

发布于 2021-04-20 20:34:24

似乎pq0,接下来抛出相同的异常:

代码语言:javascript
复制
new BigInteger(0.0 % 0);

double除以零将导致Double.NaN,它不是根据文档实例化BigInteger的有效值。

例外情况 OverflowException value是NaN,NegativeInfinity,或PositiveInfinity。

或者,正如@Heinzi在注释中正确提到的那样,Math.Pow导致了无限。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67185915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档