pi
không thể đại diện chính xác như Python float (giống như kiểu của nền tảng C double
). Giá trị gần đúng nhất có thể biểu diễn được sử dụng.
Đây là giá trị gần đúng được sử dụng trên hộp của tôi (có thể giống như trên hộp của bạn):
>>> import math
>>> (math.pi / 2).as_integer_ratio()
(884279719003555, 562949953421312)
Để tìm tiếp tuyến của tỷ lệ đó, tôi sẽ chuyển sang wxMaxima bây giờ:
(%i1) fpprec: 32;
(%o1) 32
(%i2) tan(bfloat(884279719003555) / 562949953421312);
(%o2) 1.6331239353195369755967737041529b16
Vì vậy, về cơ bản giống hệt với những gì bạn nhận được. Giá trị xấp xỉ nhị phân pi/2
được sử dụng nhỏ hơn một chút so với giá trị toán học ("độ chính xác vô hạn") của pi/2
. Vì vậy, bạn nhận được một tiếp tuyến rất lớn thay vì infinity
. Tính toán tan()
phù hợp với đầu vào thực tế!
Vì những lý do giống hệt nhau, ví dụ:
>>> math.sin(math.pi)
1.2246467991473532e-16
không trả về 0. Giá trị gần đúng math.pi
nhỏ hơn một chút pi
và kết quả được hiển thị là đúng với sự thật đó.
CÁC CÁCH KHÁC ĐỂ XEM math.pi
Có một số cách để xem giá trị gần đúng chính xác đang được sử dụng:
>>> import math
>>> math.pi.as_integer_ratio()
(884279719003555, 281474976710656)
math.pi
chính xác bằng giá trị toán học ("độ chính xác vô hạn") của tỷ lệ đó.
Hoặc như một float chính xác trong ký hiệu hex:
>>> math.pi.hex()
'0x1.921fb54442d18p+1'
Hoặc theo cách dễ hiểu nhất đối với mọi người:
>>> import decimal
>>> decimal.Decimal(math.pi)
Decimal('3.141592653589793115997963468544185161590576171875')
Mặc dù nó có thể không rõ ràng ngay lập tức, nhưng mọi số float nhị phân hữu hạn đều có thể biểu diễn chính xác dưới dạng float thập phân hữu hạn (điều ngược lại là không đúng; ví dụ: số thập phân 0.1
không thể biểu diễn chính xác như float nhị phân hữu hạn) và hàm Decimal(some_float)
tạo tạo ra giá trị tương đương chính xác.
Đây là giá trị thực của pi
theo sau là giá trị thập phân chính xác của math.pi
và một dấu mũ trên dòng thứ ba trỏ đến chữ số đầu tiên nơi chúng khác nhau:
true 3.14159265358979323846264338327950288419716939937510...
math.pi 3.141592653589793115997963468544185161590576171875
^
math.pi
hiện nay trên hầu hết các hộp "hầu như tất cả" đều giống nhau, vì hầu hết tất cả các hộp hiện sử dụng cùng một định dạng dấu phẩy động nhị phân (độ chính xác kép IEEE 754). Bạn có thể sử dụng bất kỳ cách nào ở trên để xác nhận điều đó trên hộp của mình hoặc để tìm giá trị gần đúng chính xác đang được sử dụng nếu hộp của bạn là một ngoại lệ.