2015-07-11 17 views
10

Với đoạn mã sau, nơi cả hai abNumber s đại diện cho các giá trị trong phạm vi của số nguyên ký 32-bit ký:Javascript: Đây có phải là thật Signed Integer Division

var quotient = ((a|0)/(b|0))|0; 

và giả định rằng thời gian chạy là tuân thủ đầy đủ các thông số ECMAScript 6, giá trị của quotientluôn là là số nguyên nguyên có chữ ký chính xác của ab là số nguyên? Nói cách khác, đây có phải là một phương pháp thích hợp để đạt được sự phân chia số nguyên được ký đúng trong JavaScript tương đương với lệnh máy không?

+1

Bạn đã thử tìm kiếm bất kỳ mẫu đối sánh nào có thể chứng minh nó * không phải * luôn đúng chưa? – Purag

+1

Tôi không có. Vì JavaScript chính thức giao dịch trong tất cả các điểm nổi, tôi sẽ thấy câu hỏi sắp tới, là kết quả của phép chia đôi chính xác của hai số nguyên toán học trong phạm vi số nguyên có dấu 32 bit, tiếp theo là cắt ngắn thành 32 bit số nguyên đã ký và mô phỏng quá trình tràn theo hoạt động trừu tượng 'ToInt32()' được chỉ định bởi EMCAScript 6, tương đương với một phân số nguyên của cùng một giá trị toán học? Tôi không cảm thấy mình hiểu quá trình phân chia điểm trôi nổi đủ để trả lời bản thân mình hoặc lấy được những phản đối, đó là lý do tại sao tôi hỏi ở đây. – Textfield

+1

Để chia cho số không, không - nó trả về 0 thay vì ném một ngoại lệ: https://stackoverflow.com/questions/29179876/how-does-asm-js-handle-divide-by-zero – gengkev

Trả lời

4

Tôi không có chuyên gia về số dấu phẩy động, nhưng Wikipedia nói rằng đôi có độ chính xác 52 bit. Về mặt logic, có vẻ như 52 bit phải đủ để phân chia số nguyên nguyên vẹn của các số nguyên 32 bit.

Chia ints 32 bit tối thiểu và tối đa đã ký, -2147483648/2147483647, tạo ra -1.0000000004656613, vẫn là số lượng chữ số đáng kể hợp lý. Điều tương tự cũng xảy ra đối với nghịch đảo của nó, 2147483647/-2147483648, tạo ra -0.9999999995343387.

Ngoại lệ là division by zero, mà tôi đã đề cập trong nhận xét. Khi trạng thái SO câu hỏi được liên kết, phân chia số nguyên bằng 0 thường ném một số lỗi, trong khi kết quả ép buộc dấu phẩy động trong (1/0) | 0 == 0.

Cập nhật: Theo another SO answer, chia số nguyên trong C truncates đối không, đó là những gì |0 làm trong JavaScript. Ngoài ra, chia cho 0 là không xác định, do đó, JavaScript về mặt kỹ thuật không chính xác khi trả về 0. Trừ khi tôi đã bỏ lỡ bất cứ điều gì khác, câu trả lời cho câu hỏi ban đầu phải là có.

Cập nhật 2: phần có liên quan của ECMAScript 6 spec: làm thế nào để divide numbers và làm thế nào để convert to a 32-bit signed integer, đó là what |0 does.

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