pi
ไม่สามารถแสดงเป็น Python float ได้อย่างแน่นอน (เช่นเดียวกับdouble
ประเภทของแพลตฟอร์ม C ) มีการใช้การประมาณค่าที่แสดงได้ใกล้เคียงที่สุด
นี่คือการประมาณที่แน่นอนที่ใช้กับกล่องของฉัน (อาจจะเหมือนกับในกล่องของคุณ):
>>> import math
>>> (math.pi / 2).as_integer_ratio()
(884279719003555, 562949953421312)
ในการหาค่าแทนเจนต์ของอัตราส่วนนั้นตอนนี้ฉันจะเปลี่ยนเป็น wxMaxima:
(%i1) fpprec: 32;
(%o1) 32
(%i2) tan(bfloat(884279719003555) / 562949953421312);
(%o2) 1.6331239353195369755967737041529b16
โดยพื้นฐานแล้วก็เหมือนกับสิ่งที่คุณได้รับ ประมาณไบนารีpi/2
ที่ใช้เป็นเล็กน้อยน้อยกว่ามูลค่าทางคณิตศาสตร์ ( "ความแม่นยำที่ไม่มีที่สิ้นสุด") pi/2
ของ infinity
เพื่อให้คุณได้สัมผัสขนาดใหญ่มากแทน การคำนวณtan()
นั้นเหมาะสมกับการป้อนข้อมูลจริง!
ด้วยเหตุผลประเภทเดียวกันทุกประการเช่น
>>> math.sin(math.pi)
1.2246467991473532e-16
ไม่คืนค่า 0 ค่าประมาณmath.pi
น้อยกว่าเล็กน้อยpi
และผลลัพธ์ที่แสดงจะถูกต้องเนื่องจากความจริงนั้น
วิธีอื่น ๆ ในการดู math.pi
มีหลายวิธีในการดูการประมาณที่แน่นอนในการใช้งาน:
>>> import math
>>> math.pi.as_integer_ratio()
(884279719003555, 281474976710656)
math.pi
เท่ากับค่าทางคณิตศาสตร์ ("ความแม่นยำไม่มีที่สิ้นสุด") ของอัตราส่วนนั้น
หรือเป็นลอยที่แน่นอนในสัญกรณ์ฐานสิบหก:
>>> math.pi.hex()
'0x1.921fb54442d18p+1'
หรือในทางที่ทุกคนเข้าใจได้ง่ายที่สุด:
>>> import decimal
>>> decimal.Decimal(math.pi)
Decimal('3.141592653589793115997963468544185161590576171875')
แม้ว่าอาจจะไม่ชัดเจนในทันที แต่การลอยตัวไบนารีแบบ จำกัด ทุกครั้งสามารถแสดงได้ว่าเป็นทศนิยมที่แน่นอน (การย้อนกลับไม่เป็นความจริงเช่นทศนิยม0.1
ไม่สามารถแสดงได้อย่างแน่นอนว่าเป็นเลขฐานสองแบบ จำกัด ) และตัวDecimal(some_float)
สร้างจะสร้างค่าเท่ากัน
นี่คือค่าที่แท้จริงของpi
ตามด้วยค่าทศนิยมที่แน่นอนmath.pi
และเครื่องหมายคาเร็ตในบรรทัดที่สามจะชี้ไปที่ตัวเลขตัวแรกที่ต่างกัน:
true 3.14159265358979323846264338327950288419716939937510...
math.pi 3.141592653589793115997963468544185161590576171875
^
math.pi
ตอนนี้เหมือนกันในกล่อง "เกือบทั้งหมด" เพราะตอนนี้กล่องเกือบทั้งหมดใช้รูปแบบจุดลอยตัวไบนารีเดียวกัน (IEEE 754 double precision) คุณสามารถใช้วิธีใดก็ได้ข้างต้นเพื่อยืนยันสิ่งนั้นบนกล่องของคุณหรือค้นหาการประมาณที่แม่นยำในการใช้งานหากกล่องของคุณเป็นข้อยกเว้น