Do the nature of floating-point math, .4 * .4
= 0.16000000000000003
ở Julia. Tôi muốn nhận được câu trả lời đúng về mặt toán học của 0.16
, theo cách hiệu quả của CPU. Tôi biết round() hoạt động, nhưng điều đó đòi hỏi kiến thức trước về số chữ số thập phân mà câu trả lời chiếm, vì vậy nó không phải là một giải pháp chung.Số học thập phân chính xác trong Julia
Trả lời
Một số tùy chọn:
Sử dụng inbuilt
Rational
loại. Cách chính xác nhất và nhanh nhất sẽ là16 // 100 * 16 // 100
Nếu bạn đang sử dụng số rất lớn những có thể tràn, trong trường hợp này bạn có thể sử dụng BigInt
s thay vào đó,
big(16)//big(100) * big(16)//big(100)
(bạn không thực sự cần phải bọc tất cả trong big
s, vì lý do sẽ tự động quảng bá). Bạn cũng có thể sử dụng rationalize(0.16)
, nhưng điều này có thể không hoàn toàn chính xác hoặc hiệu quả, vì chữ số 0.16
đã được chuyển đổi thành Float64
vào lúc Julia nhìn thấy nó, vì vậy bạn đang chuyển đổi sang dấu phẩy động nhị phân và sau đó đến một số Rational
.
kết thúc triển khai Intel IEEE-754 Dấu phẩy thập phân. Điều này nên được hợp lý nhanh (mặc dù không hiệu quả như nhị phân), nhưng có độ chính xác cố định, vì vậy bạn sẽ phải làm tròn tại một số điểm.
Decimals.jl là thư viện dấu phẩy động "thập phân lớn": vì nó sử dụng số học chính xác tùy ý, nó sẽ chậm hơn DecFP.
Để nói đó là tốt nhất sẽ đòi hỏi thêm thông tin về mục đích sử dụng của bạn.
Lưu ý rằng DecFP.jl cũng * nhanh hơn * so với sử dụng loại BigFloat tích hợp (do sử dụng bất biến) –
Bạn có thể sử dụng Python của decimal.Decimal
với PyCall
, nhưng hiệu quả sẽ là Python ràng buộc
nhập gói:
julia> using PyCall
julia> @pyimport decimal
julia> const Dec = decimal.Decimal
PyObject <class 'decimal.Decimal'>
Meta-xác định hoạt động (Tôi nghĩ rằng tất cả các loại định nghĩa nên một phần của PyCall
):
julia> py_methods = Dict(
:+ => :__add__,
:* => :__mul__,
:- => :__sub__,
(:/) => :__truediv__
)
Dict{Symbol,Symbol} with 4 entries:
:/ => :__truediv__
:+ => :__add__
:* => :__mul__
:- => :__sub__
julia> for (op, meth) in py_methods
op = Expr(:quote, op)
meth = Expr(:quote, meth)
@eval Base.($op){T<:PyObject}(x::T, y::T) = x[$meth](y)
end
Do một số toán học với họ:
0.123.julia> x = Dec("0.4")
PyObject Decimal('0.4')
julia> x * x
PyObject Decimal('0.16')
julia> x + x
PyObject Decimal('0.8')
julia> x - x
PyObject Decimal('0.0')
julia> x/x
PyObject Decimal('1')
julia> y = x + x * x/x - x
PyObject Decimal('0.4')
kết quả Nhận:
julia> y[:to_eng_string]() |> float
0.4
Xin lỗi, nhưng tôi sẽ không mang tất cả Python chỉ để giải quyết vấn đề này, khi gói DecFP.jl của Steven Johnson hoạt động rất tốt, không thêm nhiều chi phí cho Julia và thậm chí còn nhanh hơn việc sử dụng BigFloat! –
- 1. Phân số có độ chính xác thập phân
- 2. Số thập phân chính xác tùy ý trong C#?
- 3. SQLAlchemy thập phân chính xác
- 4. EF lấy độ chính xác thập phân không chính xác
- 5. Điều chỉnh chính xác thập phân, .net
- 6. Số học thập phân trong C hoặc C++?
- 7. Học thuyết 2 - 2 chữ số thập phân trên phao?
- 8. symfony2 chú thích quy mô học thuyết thập phân chính xác được bỏ qua
- 9. Làm cách nào để làm việc với các số thập phân chính xác cao trong PHP
- 10. WebAPI, JSON.Net và mất độ chính xác thập phân
- 11. Hoạt động thập phân và toán học
- 12. Xác định độ chính xác thập phân của số đầu vào
- 13. ggplot2 y trục nhãn độ chính xác thập phân
- 14. Số thập phân không chính xác xuất hiện trong SUM MySQL
- 15. Biểu thức chính quy cho số thập phân
- 16. Xác định số chữ số thập phân bằng Python
- 17. cách xác thực số thập phân trong PHP
- 18. Độ chính xác của phao Python không có độ chính xác số nguyên sau dấu thập phân
- 19. Toán học đằng sau * 1233 >> 12 trong mã này đếm số thập phân
- 20. Sparklyr - chính xác thập phân 8 vượt quá độ chính xác tối đa 7
- 21. Gini Hệ số trong Julia: hiệu quả và chính xác Mã
- 22. printf số biến thập phân trong phao
- 23. php chuyển đổi số thập phân sang thập lục phân
- 24. javascript chính xác làm tròn lên đến hai số thập phân, không thể?
- 25. Thập phân. Sai số định dạng chuỗi thô và không chính xác
- 26. cách đặt số thập phân chính xác trên biểu đồ thanh ggplot nhãn
- 27. Có cách nào để làm 'chính xác' làm tròn số học trong .NET không?/C#
- 28. Members javascript số thập phân
- 29. Số Oracle để C# số thập phân
- 30. lấy phần thập phân của số thập phân
Floating điểm toán đã được giải quyết. Thực tế là trường hợp cụ thể này là do các vấn đề đó có thể là câu trả lời mà OP đang tìm kiếm. Câu thứ hai (làm thế nào để có được câu trả lời chính xác trong Julia) một phần có vẻ hợp pháp ... Anh ta không phải là sau khi tất cả gắn liền với việc sử dụng điểm nổi. –
"Cách cpu chuyên sâu nhất" là gì - tại sao bạn thậm chí còn quan tâm đến hiệu suất khi bạn thậm chí không có tính chính xác? –
Một lựa chọn hợp lý trong Julia là số học hợp lý: '4 // 10 * 4 // 10' ->' 4 // 25', và kết quả của 'float (4 // 25)' thực sự là số dấu phẩy động gần nhất đến 0,16. –