2010-12-29 37 views
14

Trong javascript Tôi muốn tạo ra băm nhị phân của một mảng boolean lớn (54 phần tử) với các phương pháp sau đây:Javascript cách tổng hợp các số nguyên lớn

function bhash(arr) { 
    for (var i = 0, L = arr.length, sum = 0; i < L; sum += Math.pow(2,i)*arr[i++]); 
    return sum; 
} 

Nói tóm lại: nó tạo ra số nguyên nhỏ nhất để lưu trữ một mảng Bây giờ vấn đề của tôi là javascript rõ ràng sử dụng float làm mặc định. Số lượng tối đa mà tôi phải tạo là 2^54-1 nhưng khi javascript đạt đến 2^53 thì bắt đầu làm những điều kỳ lạ:

9007199254740992+1 = 9007199254740994 

Có cách nào sử dụng số nguyên thay vì nổi trong javascript không? Hoặc tổng số nguyên lớn?

+3

Javascript không chỉ sử dụng loại dấu phẩy động làm mặc định, nó không * có * bất kỳ loại số nào khác - quyết định không phải là "phần tốt" của ngôn ngữ. –

Trả lời

18

Javascript sử dụng điểm nổi bên trong.

What is JavaScript's highest integer value that a Number can go to without losing precision?

Nói cách khác, bạn không thể sử dụng quá 53 bit. Trong một số triển khai, bạn có thể bị giới hạn ở 31.

Thử lưu trữ các bit trong nhiều biến, sử dụng chuỗi hoặc nhận bignum library hoặc nếu bạn chỉ cần xử lý số nguyên, biginteger library.

+1

Nó hoạt động khi tôi thêm thư viện đó và chỉnh sửa chức năng như sau: 'function bhash (arr) { \t \t cho (var i = 0, L = arr.length, sum = new BigNumber (" 0 "); i < L; sum = new BigNumber (Math.pow (2, i) * arr [i ++]) thêm (tổng)); \t \t số tiền hoàn trả; \t} ' – Raven

1

Có nhiều thư viện Javascript BigInteger khác nhau mà bạn có thể tìm thấy thông qua googling. ví dụ. http://www.leemon.com/crypto/BigInt.html

+0

Tôi đã làm như sau: '' nhưng cosole đã cho tôi một lỗi> độ dài mảng không hợp lệ: "buff = new Array (k);" – Raven

1

Không. Chỉ Javascript có một loại số. Bạn đã tự viết mã hoặc sử dụng một thư viện số nguyên lớn (và bạn thậm chí không thể quá tải toán tử số học).

0

có thể bạn đang chạy vào giới hạn độ dài byte trên hệ thống của mình. tôi lấy mảng boolean, chuyển nó thành một mảng các số nhị phân ([true, false, true] => [1,0,1]), sau đó nối mảng này thành chuỗi "101", sau đó sử dụng parseInt ('101', 2) và bạn sẽ có câu trả lời.

1

Thực hiện khác số học lớn số nguyên (cũng sử dụng BigInt.js) có sẵn tại www.javascripter.net/math/calculators/100digitbigintcalculator.htm. Hỗ trợ các hoạt động + - */cũng như phần còn lại, GCD, LCM, giai thừa, thử nghiệm nguyên thủy, nguyên tố tiếp theo, nguyên tố trước.

Các vấn đề liên quan