具有大数量的模数% - 无穷大错误 - Javascript

时间:2016-10-16 20:47:16

标签: javascript math modulo pow infinity

是否有诀窍在Javascript中获取大数字的模数。 function modulo (n, p, m){ var x = Math.pow(n, p); var y = m; var z = x%y; alert(x); return z; } 7 ^ 16971mod25777 = NaN

const char * month(int x)
{
    char result[40];
    if(x<=31) strcpy(result,"can be a day of the month");
    else strcpy(result,"cannot be a day of the month");
    return result;
}

4 个答案:

答案 0 :(得分:9)

如果您可以假设所有参数都是整数,那么可以使用数学“技巧”。

考虑以下模数操作:

  

(a * x + y)%x

显然, a * x 部分可以被丢弃,以下内容成立:

  

(a * x + y)%x = y%x

考虑到这一点,我们可以假设大数字只是 a * x + y ,我们可以在任何阶段执行模数,并且我们可以随时执行模数,以便获得你想要的结果,做到这一点:

function modulo (n, p, m){
  var result = 1;
  while(p--) {
    result = (result * n) % m;
  }
  
  return result;
}

console.log(modulo(7, 16971, 25777));

答案 1 :(得分:3)

JavaScript编号存储为64-bit floats

Math.pow(7, 16971)Infinity,因为该值对于该表示而言太大。具体来说,它大于Number.MAX_VALUE,即1.7976931348623157e+308

最大的安全整数是Math.pow(2, 53) - 1),又名Number.MAX_SAFE_INTEGER

您可以使用像big-integer这样的任意大小的整数库来处理更大的整数:

const result = bigInt(7).modPow(16971, 25777);
console.log(result.value); // 857

JSFiddle

答案 2 :(得分:1)

您可能希望查看大量的库,例如big.js来执行此操作。它有自己的mod()函数来处理更大的数字和更高的浮点精度。

从手册:

1 % 0.9                    // 0.09999999999999998
x = new Big(1)
x.mod(0.9)                 // '0.1'

答案 3 :(得分:1)

  

请试试这个,它应该对你有用......

 <script src="http://peterolson.github.com/BigInteger.js/BigInteger.min.js"></script>
<script>
    function modulo(n, p, m) {
        var x = bigInt(n).pow(p);
        var y = m;
        var z = bigInt(x).mod(y);
        alert(x);
        alert(z);
        return z;
    }
    modulo(7, 16971, 25777);

</script>
  

X =的值(14415744684045163523508370611090785241574922885925252914890639199976699467725664851459663551833811887474524559950402764556920547425905677376769769036370446863289215279501671505532457544508768278125231300586904556888410915082579994454633789306430070917839814671051546821261007944822597224906648849904922537274707680643363165978619498834429449777375956457500016286957436501493782961110010828250806883976948842721880941847614364144433416094884309738714697545898054919488359697505801455360103915003997492259912481275268331981878547474786104106986979799802281936965261975982524485968640768817957550867986154368367635369293192878136528492396776296276118990368379326864720308913557816108979284563405642510547312049065772497469404011014013450444971506185205815949481385544046621877285217297509758256290889505731105047286926071519226905179409110283775307354138498282712161841437257545234400436036427667708739854981226032544814122694788132851577335197661627641763812802281568005329331061731925 1468387901625157 ... 569513337492575990331268833421831511786689198120640499653495604661506825256510945080486671659755390007646441727676481635183661949535738178851031677186307431420626235505495413592204274113527083644833890609868449292691432591350082529064612880984219336033737745141263474770002794313294683631604235115451294875031788390988803699373289964121269316870972102201917260877294425558308703263235129517673885051515592276246663179715263508950043020907301980021247998870571804930282811668539901827709367263924036453673049618286450952210201004699652921842045202131663688487232236216511076540750621162177442425522620314578783413431312393247947115185913273611439164821108666866185724910759435112330449283424419337576546620897624709431945968747176234968193424033060385222664281980183645685159081026862002337573947761274562400308222049602425123979465543888552328327839309549797620300895470047761206265139100304442796650476103884541141979393483105632260060274004346162396747840188285803530089382250350 36985223336494743),请看下面的输出屏幕。

enter image description here

  

Z =(857)的值。请看下面的输出屏幕。

enter image description here