17db96d56Sopenharmony_ci======================================
27db96d56Sopenharmony_ciPython IEEE 754 floating point support
37db96d56Sopenharmony_ci======================================
47db96d56Sopenharmony_ci
57db96d56Sopenharmony_ci>>> from sys import float_info as FI
67db96d56Sopenharmony_ci>>> from math import *
77db96d56Sopenharmony_ci>>> PI = pi
87db96d56Sopenharmony_ci>>> E = e
97db96d56Sopenharmony_ci
107db96d56Sopenharmony_ciYou must never compare two floats with == because you are not going to get
117db96d56Sopenharmony_ciwhat you expect. We treat two floats as equal if the difference between them
127db96d56Sopenharmony_ciis small than epsilon.
137db96d56Sopenharmony_ci>>> EPS = 1E-15
147db96d56Sopenharmony_ci>>> def equal(x, y):
157db96d56Sopenharmony_ci...     """Almost equal helper for floats"""
167db96d56Sopenharmony_ci...     return abs(x - y) < EPS
177db96d56Sopenharmony_ci
187db96d56Sopenharmony_ci
197db96d56Sopenharmony_ciNaNs and INFs
207db96d56Sopenharmony_ci=============
217db96d56Sopenharmony_ci
227db96d56Sopenharmony_ciIn Python 2.6 and newer NaNs (not a number) and infinity can be constructed
237db96d56Sopenharmony_cifrom the strings 'inf' and 'nan'.
247db96d56Sopenharmony_ci
257db96d56Sopenharmony_ci>>> INF = float('inf')
267db96d56Sopenharmony_ci>>> NINF = float('-inf')
277db96d56Sopenharmony_ci>>> NAN = float('nan')
287db96d56Sopenharmony_ci
297db96d56Sopenharmony_ci>>> INF
307db96d56Sopenharmony_ciinf
317db96d56Sopenharmony_ci>>> NINF
327db96d56Sopenharmony_ci-inf
337db96d56Sopenharmony_ci>>> NAN
347db96d56Sopenharmony_cinan
357db96d56Sopenharmony_ci
367db96d56Sopenharmony_ciThe math module's ``isnan`` and ``isinf`` functions can be used to detect INF
377db96d56Sopenharmony_ciand NAN:
387db96d56Sopenharmony_ci>>> isinf(INF), isinf(NINF), isnan(NAN)
397db96d56Sopenharmony_ci(True, True, True)
407db96d56Sopenharmony_ci>>> INF == -NINF
417db96d56Sopenharmony_ciTrue
427db96d56Sopenharmony_ci
437db96d56Sopenharmony_ciInfinity
447db96d56Sopenharmony_ci--------
457db96d56Sopenharmony_ci
467db96d56Sopenharmony_ciAmbiguous operations like ``0 * inf`` or ``inf - inf`` result in NaN.
477db96d56Sopenharmony_ci>>> INF * 0
487db96d56Sopenharmony_cinan
497db96d56Sopenharmony_ci>>> INF - INF
507db96d56Sopenharmony_cinan
517db96d56Sopenharmony_ci>>> INF / INF
527db96d56Sopenharmony_cinan
537db96d56Sopenharmony_ci
547db96d56Sopenharmony_ciHowever unambigous operations with inf return inf:
557db96d56Sopenharmony_ci>>> INF * INF
567db96d56Sopenharmony_ciinf
577db96d56Sopenharmony_ci>>> 1.5 * INF
587db96d56Sopenharmony_ciinf
597db96d56Sopenharmony_ci>>> 0.5 * INF
607db96d56Sopenharmony_ciinf
617db96d56Sopenharmony_ci>>> INF / 1000
627db96d56Sopenharmony_ciinf
637db96d56Sopenharmony_ci
647db96d56Sopenharmony_ciNot a Number
657db96d56Sopenharmony_ci------------
667db96d56Sopenharmony_ci
677db96d56Sopenharmony_ciNaNs are never equal to another number, even itself
687db96d56Sopenharmony_ci>>> NAN == NAN
697db96d56Sopenharmony_ciFalse
707db96d56Sopenharmony_ci>>> NAN < 0
717db96d56Sopenharmony_ciFalse
727db96d56Sopenharmony_ci>>> NAN >= 0
737db96d56Sopenharmony_ciFalse
747db96d56Sopenharmony_ci
757db96d56Sopenharmony_ciAll operations involving a NaN return a NaN except for nan**0 and 1**nan.
767db96d56Sopenharmony_ci>>> 1 + NAN
777db96d56Sopenharmony_cinan
787db96d56Sopenharmony_ci>>> 1 * NAN
797db96d56Sopenharmony_cinan
807db96d56Sopenharmony_ci>>> 0 * NAN
817db96d56Sopenharmony_cinan
827db96d56Sopenharmony_ci>>> 1 ** NAN
837db96d56Sopenharmony_ci1.0
847db96d56Sopenharmony_ci>>> NAN ** 0
857db96d56Sopenharmony_ci1.0
867db96d56Sopenharmony_ci>>> 0 ** NAN
877db96d56Sopenharmony_cinan
887db96d56Sopenharmony_ci>>> (1.0 + FI.epsilon) * NAN
897db96d56Sopenharmony_cinan
907db96d56Sopenharmony_ci
917db96d56Sopenharmony_ciMisc Functions
927db96d56Sopenharmony_ci==============
937db96d56Sopenharmony_ci
947db96d56Sopenharmony_ciThe power of 1 raised to x is always 1.0, even for special values like 0,
957db96d56Sopenharmony_ciinfinity and NaN.
967db96d56Sopenharmony_ci
977db96d56Sopenharmony_ci>>> pow(1, 0)
987db96d56Sopenharmony_ci1.0
997db96d56Sopenharmony_ci>>> pow(1, INF)
1007db96d56Sopenharmony_ci1.0
1017db96d56Sopenharmony_ci>>> pow(1, -INF)
1027db96d56Sopenharmony_ci1.0
1037db96d56Sopenharmony_ci>>> pow(1, NAN)
1047db96d56Sopenharmony_ci1.0
1057db96d56Sopenharmony_ci
1067db96d56Sopenharmony_ciThe power of 0 raised to x is defined as 0, if x is positive. Negative
1077db96d56Sopenharmony_cifinite values are a domain error or zero division error and NaN result in a
1087db96d56Sopenharmony_cisilent NaN.
1097db96d56Sopenharmony_ci
1107db96d56Sopenharmony_ci>>> pow(0, 0)
1117db96d56Sopenharmony_ci1.0
1127db96d56Sopenharmony_ci>>> pow(0, INF)
1137db96d56Sopenharmony_ci0.0
1147db96d56Sopenharmony_ci>>> pow(0, -INF)
1157db96d56Sopenharmony_ciinf
1167db96d56Sopenharmony_ci>>> 0 ** -1
1177db96d56Sopenharmony_ciTraceback (most recent call last):
1187db96d56Sopenharmony_ci...
1197db96d56Sopenharmony_ciZeroDivisionError: 0.0 cannot be raised to a negative power
1207db96d56Sopenharmony_ci>>> pow(0, NAN)
1217db96d56Sopenharmony_cinan
1227db96d56Sopenharmony_ci
1237db96d56Sopenharmony_ci
1247db96d56Sopenharmony_ciTrigonometric Functions
1257db96d56Sopenharmony_ci=======================
1267db96d56Sopenharmony_ci
1277db96d56Sopenharmony_ci>>> sin(INF)
1287db96d56Sopenharmony_ciTraceback (most recent call last):
1297db96d56Sopenharmony_ci...
1307db96d56Sopenharmony_ciValueError: math domain error
1317db96d56Sopenharmony_ci>>> sin(NINF)
1327db96d56Sopenharmony_ciTraceback (most recent call last):
1337db96d56Sopenharmony_ci...
1347db96d56Sopenharmony_ciValueError: math domain error
1357db96d56Sopenharmony_ci>>> sin(NAN)
1367db96d56Sopenharmony_cinan
1377db96d56Sopenharmony_ci>>> cos(INF)
1387db96d56Sopenharmony_ciTraceback (most recent call last):
1397db96d56Sopenharmony_ci...
1407db96d56Sopenharmony_ciValueError: math domain error
1417db96d56Sopenharmony_ci>>> cos(NINF)
1427db96d56Sopenharmony_ciTraceback (most recent call last):
1437db96d56Sopenharmony_ci...
1447db96d56Sopenharmony_ciValueError: math domain error
1457db96d56Sopenharmony_ci>>> cos(NAN)
1467db96d56Sopenharmony_cinan
1477db96d56Sopenharmony_ci>>> tan(INF)
1487db96d56Sopenharmony_ciTraceback (most recent call last):
1497db96d56Sopenharmony_ci...
1507db96d56Sopenharmony_ciValueError: math domain error
1517db96d56Sopenharmony_ci>>> tan(NINF)
1527db96d56Sopenharmony_ciTraceback (most recent call last):
1537db96d56Sopenharmony_ci...
1547db96d56Sopenharmony_ciValueError: math domain error
1557db96d56Sopenharmony_ci>>> tan(NAN)
1567db96d56Sopenharmony_cinan
1577db96d56Sopenharmony_ci
1587db96d56Sopenharmony_ciNeither pi nor tan are exact, but you can assume that tan(pi/2) is a large value
1597db96d56Sopenharmony_ciand tan(pi) is a very small value:
1607db96d56Sopenharmony_ci>>> tan(PI/2) > 1E10
1617db96d56Sopenharmony_ciTrue
1627db96d56Sopenharmony_ci>>> -tan(-PI/2) > 1E10
1637db96d56Sopenharmony_ciTrue
1647db96d56Sopenharmony_ci>>> tan(PI) < 1E-15
1657db96d56Sopenharmony_ciTrue
1667db96d56Sopenharmony_ci
1677db96d56Sopenharmony_ci>>> asin(NAN), acos(NAN), atan(NAN)
1687db96d56Sopenharmony_ci(nan, nan, nan)
1697db96d56Sopenharmony_ci>>> asin(INF), asin(NINF)
1707db96d56Sopenharmony_ciTraceback (most recent call last):
1717db96d56Sopenharmony_ci...
1727db96d56Sopenharmony_ciValueError: math domain error
1737db96d56Sopenharmony_ci>>> acos(INF), acos(NINF)
1747db96d56Sopenharmony_ciTraceback (most recent call last):
1757db96d56Sopenharmony_ci...
1767db96d56Sopenharmony_ciValueError: math domain error
1777db96d56Sopenharmony_ci>>> equal(atan(INF), PI/2), equal(atan(NINF), -PI/2)
1787db96d56Sopenharmony_ci(True, True)
1797db96d56Sopenharmony_ci
1807db96d56Sopenharmony_ci
1817db96d56Sopenharmony_ciHyberbolic Functions
1827db96d56Sopenharmony_ci====================
1837db96d56Sopenharmony_ci
184