Gần đây, một phóng viên được đề cập float.as_integer_ratio()
, mới trong Python 2.6, lưu ý rằng việc triển khai điểm nổi điển hình về cơ bản là xấp xỉ số thực. Tò mò, tôi đã phải cố gắng π:Hạn chế thực hiện của float.as_integer_ratio()
>>> float.as_integer_ratio(math.pi);
(884279719003555L, 281474976710656L)
Tôi đã nhẹ ngạc nhiên không thấy càng accurate kết quả do Arima,:
(428224593349304L, 136308121570117L)
Ví dụ, mã này:
#! /usr/bin/env python
from decimal import *
getcontext().prec = 36
print "python: ",Decimal(884279719003555)/Decimal(281474976710656)
print "Arima: ",Decimal(428224593349304)/Decimal(136308121570117)
print "Wiki: 3.14159265358979323846264338327950288"
sản xuất kết quả này:
python: 3.14159265358979311599796346854418516 Arima: 3.14159265358979323846264338327569743 Wiki: 3.14159265358979323846264338327950288
Chắc chắn, kết quả là chính xác với độ chính xác được cung cấp bởi số dấu phẩy động 64 bit, nhưng nó dẫn tôi hỏi: Làm thế nào tôi có thể tìm hiểu thêm về các giới hạn triển khai của as_integer_ratio()
? Cảm ơn bạn đã hướng dẫn.
Liên kết bổ sung: Stern-Brocot tree và Python source.
Câu trả lời được chấp nhận là gây hiểu lầm. Phương thức 'as_integer_ratio' trả về tử số và mẫu số của một phân số có giá trị _exactly_ khớp với giá trị của số dấu phẩy động được truyền cho nó. Nếu bạn muốn một biểu diễn chính xác hoàn toàn của float của bạn như một phần nhỏ, sử dụng 'as_integer_ratio'. Nếu bạn muốn một _approximation_ đơn giản hóa với mẫu số nhỏ hơn và tử số, hãy nhìn vào 'fractions.Fraction.limit_denominator'. IOW, 'math.pi' là xấp xỉ π. Nhưng '884279719003555/281474976710656' là _not_ một xấp xỉ với' math.pi'; nó là _exactly_ bằng với nó. –
@MarkDickinson: Quan điểm của bạn được thực hiện tốt; nó làm rõ [câu trả lời liên quan] này (https://stackoverflow.com/a/2076903/230513). Mặc dù [câu trả lời được chấp nhận] (https://stackoverflow.com/a/2076296/230513) có thể sử dụng một số bảo trì, nó đã giúp tôi nhìn thấy nơi mà suy nghĩ của tôi đã biến mất. – trashgod