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