2009-11-24 31 views
6

Tôi muốn sử dụng lua (nội bộ chỉ sử dụng đôi) để biểu diễn một số nguyên không thể làm tròn lỗi giữa 0 và 2^64-1 hoặc khủng khiếp mọi thứ sẽ xảy ra.Có thể nhân đôi được sử dụng để đại diện cho số 64 bit mà không bị mất chính xác

Có thể làm như vậy không?

+2

Độ chính xác kép của IEEE 64 bit cung cấp chính xác 53 bit của phần định trị. Các bit còn lại dành cho ký hiệu và số mũ. –

Trả lời

14

Không

Ít nhất một số bit của một 64-bit đôi phải được sử dụng để đại diện cho số mũ (vị trí của điểm nhị phân), và do đó có ít hơn 64-bit có sẵn cho các con số thực tế . Vì vậy, không, một đôi 64-bit không thể đại diện cho tất cả các giá trị một số nguyên 64-bit có thể (và ngược lại).

+1

Vâng - đó là sự thật miễn là bạn không có chức năng ánh xạ giữa số dấu phẩy động và số nguyên 64b. Bạn có thể "đại diện" số này dưới dạng số dấu phẩy động khác. Nó chỉ là không thực tế :) – viraptor

+2

Ngay cả các giải pháp không thực tế có thể không hoạt động - ví dụ một giá trị NaN (SNaN) báo hiệu có thể kích hoạt một ngoại lệ nếu được xử lý trong Lua (không có ý tưởng nếu đó là sự thật - nhưng nó có thể). – stusmith

+1

Một số giá trị cho nhân đôi không được chuẩn hóa - nếu ngôn ngữ của bạn có thể tái chuẩn hóa chúng mà không cần cảnh báo, bạn không thể kết hợp an toàn 64 bit thông tin vào chúng. – bdonlan

4

Đôi là loại 64bit. Tuy nhiên bạn mất 1 bit cho biển báo và 11 cho số mũ.

Vì vậy, câu trả lời là không: không thể thực hiện được.

+3

bạn nhận được một chút vì giá trị cao nhất luôn là nonzero, tức là độ chính xác là 'total_bits - sign_bit - exp_bits + implicit_bit = 64 - 1 - 11 + 1 = 53' – Christoph

+0

Tôi không hiểu lời giải thích của bạn. Tôi hiểu rằng người ta có thể 'lạm dụng' bit dấu cho một phạm vi số gia tăng. (Vì vậy, về cơ bản sử dụng các số âm để tăng phạm vi dương) – Toad

+1

@reiner. Ví dụ, số thập phân nhị phân 0,01 ... (51 hơn 1s) ... 1 là chính xác thể hiện trong một đôi IEEE, mặc dù nó có 53 con số đáng kể. Nó được đại diện bởi một số mũ -2 (lấy 11 bit), một dấu 0 (lấy 1 bit), và một mantissa của 1 ... (50 1s) ... 1 (lấy 52 bit). Đầu tiên 1 không được lưu trữ ở bất cứ đâu, nó được giả định. Bạn sẽ luôn luôn chọn một số mũ sao cho bit "đầu tiên" của mantissa là 1, do đó bit đầu tiên được bỏ qua. Ngoại lệ là các biến thể, được xử lý hơi khác nhau (hoặc không phải là tất cả). –

-1

Tôi không biết gì về lua
nhưng nếu bạn có thể tìm hiểu cách thực hiện thao tác bit của phao bằng ngôn ngữ này, bạn có thể tạo ra một lớp bao bọc lấy số của bạn dưới dạng chuỗi và đặt bit của phao theo thứ tự đại diện cho số bạn đã cho nó
một giải pháp thực tế hơn là sử dụng một số thư viện bignum

3

Từ bộ nhớ, một số double có thể đại diện cho số nguyên đã ký 53 bit.

1

Trên 64 bit, bạn chỉ có thể lưu trữ 2^64 mã khác nhau. Điều này có nghĩa là loại 64 bit có thể đại diện cho 2^64 số nguyên không có bất kỳ vị trí nào để biểu thị cái gì khác, chẳng hạn như số dấu phẩy động.

Rõ ràng là đôi có thể đại diện cho nhiều số không phải số nguyên, vì vậy nó không thể phù hợp với yêu cầu của bạn.

5

Mặc dù bạn đã nhận được một số câu trả lời hay cho câu hỏi của mình về các loại 64 bit, bạn vẫn có thể muốn có giải pháp thiết thực cho vấn đề cụ thể của mình. Giải pháp đáng tin cậy nhất mà tôi biết là xây dựng Lua 5.1 với bản vá LNUM (còn được gọi là bản vá số nguyên Lua) có thể được tải xuống từ LuaForge. Nếu bạn không có kế hoạch xây dựng Lua từ nguồn C, thì có ít nhất một thư viện Lua thuần túy xử lý các số nguyên được ký 64 bit - xem wiki Lua-users.

+0

Cảm ơn bạn đã tham khảo, +1. –

2

Không, bạn không thể sử dụng Double để lưu trữ số nguyên 64 bit mà không làm mất chính xác.

Tuy nhiên, bạn có thể áp dụng bản vá Lua bổ sung hỗ trợ cho số nguyên 64 bit thực sự cho trình thông dịch Lua. Áp dụng bản vá LNUM cho nguồn Lua của bạn và biên dịch lại.

0

Đôi IEEE 754 không thể đại diện chính xác các số nguyên 64 bit. Nó có thể, tuy nhiên, đại diện cho chính xác tất cả các giá trị số nguyên 32-bit.

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