2009-12-08 28 views
10

Tôi là một newbie perl,Làm thế nào tôi có thể làm số học 64 bit trong Perl?

Tôi có thể sử dụng số học 64 bit trong Perl không?

Ví dụ

$operand1 = 0xFFFFFFFFFFFF; # 48 bit value 
$operand2 = 0xFFFFFFFFFFFF; # 48 bit value 

$Result = $operand1 * $operand2; 
  • tôi về cơ bản tìm kiếm một sự thay thế cho int64_t trong perl.
  • Có cách nào để đề cập đến, nếu biến số được ký hoặc chưa ký?
+1

Bạn có thực sự muốn số học 64-bit hoặc số lớn? Bạn có muốn nó tràn sau 64 bit không? –

Trả lời

13

Có, tuy nhiên bạn cần phải có Perl được biên dịch với hỗ trợ 64 bit.

+6

"sử dụng bigint" sẽ đảm bảo rằng nó luôn hoạt động. (Nếu bạn muốn tốc độ tuyệt đối, bạn đã chọn sai ngôn ngữ lập trình.) – jrockway

+4

Perl thường được sử dụng trong tin sinh học và các lĩnh vực khác đòi hỏi hiệu suất cao. Nếu các con số của bạn chắc chắn vừa với 64 bit, thì câu trả lời này sẽ tạo ra mã thực thi tốt hơn. Chỉ cần đảm bảo sử dụng phiên bản Perl gần đây và bạn có thể muốn tự biên dịch nó. "Hỗ trợ 64 bit giờ đây được coi là trưởng thành" http://dev.perl.org/perl5/news/2002/07/18/580ann/ – Colin

+7

Ngay cả với hỗ trợ 64 bit, bạn cần có ' sử dụng số nguyên; 'để tránh nhận được kết quả dấu chấm động (tròn) và thay vào đó nhận được kết quả số nguyên (số bit cắt ngắn). – ysth

5

Có, Perl tự động xử lý số học số nguyên lớn cho bạn. Tuy nhiên, Perl không cung cấp một sự phân biệt giữa các loại đã ký và chưa ký (không cần thiết, vì không có giới hạn cố định trên phạm vi số nguyên lớn).

Trang hướng dẫn perlnumber có thêm thông tin về các định dạng số khác nhau được Perl hỗ trợ.

+0

Nó không rõ ràng những gì bạn có nghĩa là bởi "phân biệt giữa các giá trị đã ký và unsigned"? – ysth

+0

Phải, tôi phải nói "loại" thay vì "giá trị". Đã sửa. –

10

Xem bigint:

hỗ trợ Transparent BigInteger cho Perl ...

Tất cả các nhà khai thác (bao gồm cả hoạt động toán học cơ bản) ngoại trừ các nhà điều hành phạm vi .. đang quá tải. Hằng số nguyên được tạo thành BigInts phù hợp.

Hằng số dấu chấm động được cắt ngắn thành số nguyên. Tất cả các phần và kết quả của biểu thức cũng bị cắt ngắn.

Không giống như integer, pragma điều này tạo ra hằng số nguyên mà chỉ giới hạn trong kích thước của chúng bằng bộ nhớ còn trống và thời gian CPU ...

+0

+1 cảm ơn bạn, nhưng tôi không thể sử dụng các hàm như hex() etc ~~~ – Alphaneo

+0

Alphaneo, bạn có thể thực hiện '$ a = Math :: BigInt-> new (" 0x ". $ Your_int)' và '$ a-> as_hex() ' – osgx

0

Hãy nhận biết, 64bit số học trong Perl là một, nhưng những gì nó được hiển thị bởi sprintf% d% u và% s, là thứ hai. Phiên bản perl hiện tại hỗ trợ 64 bit không có vấn đề, nhưng sprintf% d định dạng không,% b tương tự như vậy.

0

use bigint sẽ làm cho Perl xử lý số nguyên kích thước tùy ý một cách chính xác mà không bị tràn số nguyên.

Eg .:

use bigint; 
print 1 << 256; 

sẽ in:

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