Có triển khai thực hiện trăn thuần túy fractions.Fraction
hỗ trợ long
s làm tử số và mẫu số không? Thật không may, exponentiation dường như được mã hóa để trả lại một phao (ack !!!), ít nhất nên hỗ trợ bằng cách sử dụng decimal.Decimal
.Phân số có độ chính xác thập phân
Nếu không có, tôi cho rằng tôi có thể tạo một bản sao của thư viện và cố gắng thay thế các lần xuất hiện của float()
bằng thứ gì đó thích hợp từ Decimal
nhưng tôi muốn một cái gì đó đã được thử nghiệm bởi những người khác trước đây.
Dưới đây là một ví dụ mã:
base = Fraction.from_decimal(Decimal(1).exp())
a = Fraction(69885L, 53L)
x = Fraction(9L, 10L)
print base**(-a*x), type(base**(-a*x))
kết quả trong 0.0 <type 'float'>
nơi câu trả lời phải là một số thập phân thực sự nhỏ.
Cập nhật: Bây giờ tôi đã có công việc sau đây (giả sử, cho ** b, cả hai đều là phân số, tất nhiên, tôi sẽ cần một hàm khác khi exp_ là phao hoặc chính nó một Thập phân):
def fracpow(base, exp_):
base = Decimal(base.numerator)/Decimal(base.denominator)
exp_ = Decimal(exp_.numerator)/Decimal(exp_.denominator)
return base**exp_
cung cấp câu trả lời 4.08569925773896097019795484811E-516.
Tôi vẫn muốn quan tâm nếu có cách tốt hơn để làm điều này mà không có các chức năng bổ sung (tôi đoán nếu tôi làm việc với lớp Fraction
đủ, tôi sẽ tìm các phao khác đang hoạt động theo cách của mình).
Khi tôi phân số. (11,17) ** 2 Tôi nhận được phân số.Fraction (121, 289). Bạn được những gì? –
thử loại (phân số.Fraction (11,17) ** 2.1) – Noah
IMO, hành vi bạn thấy là chính xác, mặc dù không phải những gì bạn muốn.Kể từ khi số mũ là một phao, nó là hợp lý mà mọi thứ được chuyển đổi để nổi. Bây giờ, nếu số mũ là Phân số (21,10), điều đó sẽ thú vị hơn ... –