pi
tidak dapat direpresentasikan sebagai float Python (sama seperti tipe platform C double
). Pendekatan terdekat yang dapat direpresentasikan digunakan.
Berikut perkiraan yang tepat digunakan di kotak saya (mungkin sama seperti di kotak Anda):
>>> import math
>>> (math.pi / 2).as_integer_ratio()
(884279719003555, 562949953421312)
Untuk menemukan tangen rasio itu, saya akan beralih ke wxMaxima sekarang:
(%i1) fpprec: 32;
(%o1) 32
(%i2) tan(bfloat(884279719003555) / 562949953421312);
(%o2) 1.6331239353195369755967737041529b16
Jadi pada dasarnya identik dengan apa yang Anda dapatkan. Perkiraan biner yang pi/2
digunakan sedikit lebih kecil dari nilai matematis ("presisi tak terbatas") pi/2
. Jadi, Anda mendapatkan garis singgung yang sangat besar, bukan infinity
. Penghitungan tan()
sesuai untuk input aktual!
Untuk jenis alasan yang persis sama, misalnya,
>>> math.sin(math.pi)
1.2246467991473532e-16
tidak mengembalikan 0. Pendekatannya math.pi
sedikit kurang dari pi
, dan hasil yang ditampilkan benar mengingat kebenaran itu.
CARA LAIN MELIHAT math.pi
Ada beberapa cara untuk melihat perkiraan yang tepat yang digunakan:
>>> import math
>>> math.pi.as_integer_ratio()
(884279719003555, 281474976710656)
math.pi
sama persis dengan nilai matematika ("presisi tak terbatas") dari rasio itu.
Atau sebagai pelampung yang tepat dalam notasi hex:
>>> math.pi.hex()
'0x1.921fb54442d18p+1'
Atau dengan cara yang paling mudah dipahami oleh hampir semua orang:
>>> import decimal
>>> decimal.Decimal(math.pi)
Decimal('3.141592653589793115997963468544185161590576171875')
Meskipun mungkin tidak langsung terlihat jelas, setiap pelampung biner hingga persis dapat direpresentasikan sebagai pelampung desimal hingga (kebalikannya tidak benar; misalnya desimal 0.1
tidak dapat secara tepat dapat direpresentasikan sebagai pelampung biner hingga), dan Decimal(some_float)
konstruktor menghasilkan padanan yang tepat.
Inilah nilai sebenarnya dari pi
diikuti dengan nilai desimal yang tepat dari math.pi
, dan tanda sisipan pada baris ketiga menunjuk ke digit pertama yang berbeda:
true 3.14159265358979323846264338327950288419716939937510...
math.pi 3.141592653589793115997963468544185161590576171875
^
math.pi
sekarang sama di "hampir semua" kotak, karena hampir semua kotak sekarang menggunakan format titik mengambang biner yang sama (presisi ganda IEEE 754). Anda dapat menggunakan salah satu cara di atas untuk mengonfirmasi hal itu pada kotak Anda , atau untuk menemukan perkiraan yang tepat digunakan jika kotak Anda merupakan pengecualian.