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). Ви можете скористатися будь-яким із наведених вище способів, щоб підтвердити це на вашій коробці або знайти точне наближення, яке використовується, якщо ваша коробка є винятком.