2017-11-19 5 views
0

私はbigintライブラリが必要か、通常のjs番号で十分かどうかを判断しようとしています。私は、チャンクのサイズをビット単位で100GBに分割して、チャンクの数を取得したい:。私はjsが正確な分割に問題があることを覚えています。Javascript bigint division

結果にx = Math.ceil(x.0)の代わりにx+1 = Math.ceil(x.00000000000..01)が得られる可能性はありますか?

+0

あなたの値が「2.5」である場合、おそらく精度が緩くなります。 –

+0

@JonasW。 'ceil'の結果は同じになるので、2.5では重要ではありません。 – inf3rno

答えて

0

私は試してみることに決めました。通常のjs数の精度は、3〜4PBのファイルサイズでは不十分です。だからFirefoxのjsの整数は約55ビットの精度を持っています。私はこれがブラウザによって異なるかもしれないと思うが、私はnodejsのためにこれを必要とする。

console.log("start"); 

var B = 8; 
var KB = 1024*B; 
var MB = 1024*KB; 
var GB = 1024*MB; 
var TB = 1024*GB; 
var PB = 1024*TB; 
var EB = 1024*PB; 

var maxBits = 4 * PB; 
var bitSteps = 100 * TB; 
var maxChunkSize = 333 * B; 

for (var bits = 0; bits <= maxBits; bits += bitSteps) 
    for (var chunkSize = 1; chunkSize <= maxChunkSize; ++chunkSize) { 
     var calculatedChunkCount = Math.ceil(bits/chunkSize); 
     var calculatedBits = calculatedChunkCount * chunkSize; 
     var difference = calculatedBits - bits; 
     var error = difference>= chunkSize || difference<0; 
     if (error) 
      console.log({ 
       chunkSize: chunkSize, 
       calculatedChunkCount: calculatedChunkCount, 
       bits: bits, 
       calculatedBits: calculatedBits, 
       difference: difference 
      }); 
    } 

console.log("end"); 

出力:

{ chunkSize: 97, calculatedChunkCount: 290180388361501, bits: 28147497671065600, calculatedBits: 28147497671065596, difference: -4 } 
{ chunkSize: 1579, calculatedChunkCount: 20611490932343, bits: 32545544182169600, calculatedBits: 32545544182169596, difference: -4 } 

私は念のために夜のために並列nodejsスクリプトを起動しますが、私は精度が0で十分だと思い - 100ギガバイトの範囲。

別の回答によると:https://stackoverflow.com/a/2803010/607033 js整数は53ビットまで正確です。したがって、この分割限度はその値に近いかもしれません。