2015-12-22 16 views
7

Tôi đã học được rằng trình đọc Clojure diễn giải chữ thập phân với hậu tố 'M', như 1,23M, như BigDecimal. Và tôi cũng biết rằng các số thập phân không có chữ 'M' trở thành Java đôi.
Nhưng tôi nghĩ tốt hơn là số thập phân thông thường là BigDecimal và số thập phân phụ thuộc vào máy chủ có hậu tố, như 1.23H. Vì vậy, khi số bị hỏng hoặc cắt ngắn do giới hạn chính xác của IEEE double, chúng ta có thể dễ dàng nhận thấy rằng số đó là giới hạn chính xác. Ngoài ra, tôi nghĩ rằng biểu thức dễ dàng hơn sẽ không phụ thuộc vào máy chủ.

Có bất kỳ lý do nào mà Clojure diễn giải các số thập phân bằng chữ cái như Java đôi, ngoài hiệu suất thời gian? Ngoài ra, tôi không nghĩ rằng hiệu suất thời gian là một câu trả lời, bởi vì nó không phải là C/C++, và cách khác để khai báo số thập phân phụ thuộc vào máy chủ có thể được thực hiện giống như '1.23H'.Có lý do nào mà chữ số thập phân mặc định không phải là loại BigDecimal trong Clojure?

Trả lời

10

Khi lên trên một thời gian, cho số nguyên, Clojure sẽ tự động quảng cáo với kích thước lớn hơn khi cần. Điều này đã được thay đổi để các ngoại lệ tràn được ném ra. Ý nghĩa của tôi, từ xa là:

  1. Quyền hạn có nghĩa là Clojure là ngôn ngữ thực tế làm những việc thực tế trong một khoảng thời gian thực tế. Họ không muốn hiệu năng nổ tung bởi vì các phép toán số bất ngờ sử dụng các thư viện chính xác tùy ý thay vì các hoạt động số nguyên CPU. Tương phản với lược đồ có vẻ ưu tiên tính toán toán học hơn tính thực tiễn.
  2. Mọi người không thích bị bất ngờ khi chạy các cuộc gọi liên tiếp sẽ thất bại vì thư viện Java dự kiến ​​số nguyên 32 bit thay vì số nguyên có kích thước tùy ý.

Vì vậy, quyết định mặc định là sử dụng số nguyên bình thường (Tôi nghĩ Java dài?) Và chỉ sử dụng số nguyên lớn tùy ý khi lập trình viên gọi nó, khi lập trình viên cố ý quyết định rằng họ sẵn sàng chấp nhận hiệu suất hit, và hit inter-op.

My đoán là các quyết định tương tự được thực hiện cho các số có dấu thập phân.

4

Hiệu suất có thể là một điều. Có lẽ clojure.core nhà phát triển có thể kêu gọi về các lý do.

Cá nhân tôi nghĩ rằng nó không phải là quá nhiều của một vấn đề lớn không có BigDecimal theo mặc định, vì:

  • có một chữ cho rằng khi bạn chỉ ra: M
  • có các hoạt động như +' , *', -' ... (lưu ý báo giá) rằng "hỗ trợ độ chính xác tùy ý".
+0

Tôi nhận thấy rằng clojure tự động quảng bá lâu dài với BigInt bằng '* ''. Tuy nhiên, khi tôi gõ '(* '1e200 1e200)' và '(*' 1e-200 1e-200)', hãy chỉ nói 'Infinity' và' 0.0'. Tại sao các chức năng tự động quảng cáo đó không hỗ trợ loại kép? – burrownn

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