Giá trị động chính xác gấp đôi trong Python? [đóng cửa]


83

Có kiểu dữ liệu nào có độ chính xác tốt hơn float không?


3
Đây thực sự là hai câu hỏi có câu trả lời khác nhau. 1: các giá trị chính xác kép trong python là float và 2: kiểu dữ liệu có độ chính xác tốt hơn float sẽ là số thập phân. Những câu hỏi như thế này có thể được tách ra bằng cách nào đó? Câu trả lời được chấp nhận địa chỉ số 2, nhưng hầu hết các địa chỉ câu trả lời được ủng hộ số 1.
nổ

Câu trả lời:


51

Kiểu dữ liệu thập phân

  • Không giống như dấu phẩy động nhị phân dựa trên phần cứng, mô-đun thập phân có độ chính xác có thể thay đổi của người dùng (mặc định là 28 vị trí) có thể lớn đến mức cần thiết cho một vấn đề nhất định.

Nếu bạn bị thúc ép bởi các điều khoản hiệu suất, hãy xem GMPY


Nếu tôi hỏi câu hỏi ban đầu, thì @ larsmans's sẽ là câu trả lời (mặc dù về mặt hình thức nó lạc đề).
Piotr Findeisen

@PiotrFindeisen Câu trả lời đó ở đâu?
PleaseHelp

Không có ý kiến, nhưng bây giờ tôi muốn tham khảo @FredFoo. Nói chung "Giá trị động chính xác gấp đôi trong Python?" → " float-s độ chính xác gấp đôi"
Piotr Findeisen

117

floatKiểu tích hợp của Python có độ chính xác gấp đôi (đó là C doubletrong CPython, Java doubletrong Jython). Nếu bạn cần độ chính xác cao hơn, hãy lấy NumPy và sử dụng nó numpy.float128.


15
Rõ ràng, numpy.float128thường có độ chính xác 64 bit trên hệ thống 64 bit. numpy.float128(1) + numpy.float128(2**-64) - numpy.float128(1)lợi nhuận 0.0. Xem stackoverflow.com/a/29821557/420755
Jeff

16

Đối với một số ứng dụng, bạn có thể sử dụng Fractionthay vì số dấu phẩy động.

>>> from fractions import Fraction
>>> Fraction(1, 3**54)
Fraction(1, 58149737003040059690390169)

(Đối với các ứng dụng khác, có decimal, như được đề xuất bởi các phản hồi khác.)


1
làm cách nào để chọn giữa Thập phân và Phân số? Phân số có vẻ tốt hơn vì nó có thể đại diện cho các phân số liên tục mà tôi đoán Decimal không thể?
Janus Troelsen

1
@Janus: xem xét các yêu cầu của bạn và chọn một cái phù hợp với họ hơn. Sử dụng Decimalkhi bạn muốn làm việc với các số gần đúng có độ chính xác cố định (nhưng có thể định cấu hình). Sử dụng Fractionkhi bạn muốn làm việc với các tỷ lệ chính xác và sẵn sàng đáp ứng các yêu cầu lưu trữ không giới hạn của chúng.
Gareth Rees

Fraction có hỗ trợ tất cả các thao tác bạn có thể làm với float không?
danijar


0

Đây là giải pháp của tôi. Đầu tiên tôi tạo các số ngẫu nhiên với random.uniform, định dạng chúng thành chuỗi với độ chính xác gấp đôi và sau đó chuyển đổi chúng trở lại thành float. Bạn có thể điều chỉnh độ chính xác bằng cách thay đổi '.2f' thành '.3f', v.v.

import random
from decimal import Decimal

GndSpeedHigh = float(format(Decimal(random.uniform(5, 25)), '.2f'))
GndSpeedLow = float(format(Decimal(random.uniform(2, GndSpeedHigh)), '.2f'))
GndSpeedMean = float(Decimal(format(GndSpeedHigh + GndSpeedLow) / 2, '.2f')))
print(GndSpeedMean)

Tốt. Độ chính xác kép có nghĩa là biểu diễn nhị phân có độ dài gấp đôi của biến so với biểu diễn nhị phân của float. Không phải hai chữ số thập phân.
kravemir

Bạn đúng rồi. Tôi có thể đã sử dụng tiêu chí tìm kiếm không tốt khi bản thân tôi gặp vấn đề này và đây là kết quả. Một số người khác có thể tìm kiếm vấn đề tương tự như tôi đã làm và kết thúc ở đây. Hy vọng rằng họ tìm thấy một số nhẹ nhõm. :)
Bittikettu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.