diff options
author | Mark Dickinson <dickinsm@gmail.com> | 2009-12-16 20:23:42 (GMT) |
---|---|---|
committer | Mark Dickinson <dickinsm@gmail.com> | 2009-12-16 20:23:42 (GMT) |
commit | 664b511c0acdfdecdec92d2255ffd94c4e6d5f7a (patch) | |
tree | 075cdf8651d66f24e42c1b87e57e7423e3e7a9d3 /Lib/test | |
parent | ef1992b9fbcfb1dae7e946bfc42403fcaae9f044 (diff) | |
download | cpython-664b511c0acdfdecdec92d2255ffd94c4e6d5f7a.zip cpython-664b511c0acdfdecdec92d2255ffd94c4e6d5f7a.tar.gz cpython-664b511c0acdfdecdec92d2255ffd94c4e6d5f7a.tar.bz2 |
Merged revisions 76861 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r76861 | mark.dickinson | 2009-12-16 20:13:40 +0000 (Wed, 16 Dec 2009) | 3 lines
Issue #3366: Add expm1 function to math module. Thanks Eric Smith for
testing on Windows.
........
Diffstat (limited to 'Lib/test')
-rw-r--r-- | Lib/test/math_testcases.txt | 70 | ||||
-rw-r--r-- | Lib/test/test_math.py | 13 |
2 files changed, 76 insertions, 7 deletions
diff --git a/Lib/test/math_testcases.txt b/Lib/test/math_testcases.txt index 2b1fc69..bb99290 100644 --- a/Lib/test/math_testcases.txt +++ b/Lib/test/math_testcases.txt @@ -249,3 +249,73 @@ gam0132 gamma -4503599627370495.5 -> 0.0 -- thanks to loss of accuracy in 1-x gam0140 gamma -63.349078729022985 -> 4.1777971677761880e-88 gam0141 gamma -127.45117632943295 -> 1.1831110896236810e-214 + +----------------------------------------------------------- +-- expm1: exp(x) - 1, without precision loss for small x -- +----------------------------------------------------------- + +-- special values +expm10000 expm1 0.0 -> 0.0 +expm10001 expm1 -0.0 -> -0.0 +expm10002 expm1 inf -> inf +expm10003 expm1 -inf -> -1.0 +expm10004 expm1 nan -> nan + +-- expm1(x) ~ x for tiny x +expm10010 expm1 5e-324 -> 5e-324 +expm10011 expm1 1e-320 -> 1e-320 +expm10012 expm1 1e-300 -> 1e-300 +expm10013 expm1 1e-150 -> 1e-150 +expm10014 expm1 1e-20 -> 1e-20 + +expm10020 expm1 -5e-324 -> -5e-324 +expm10021 expm1 -1e-320 -> -1e-320 +expm10022 expm1 -1e-300 -> -1e-300 +expm10023 expm1 -1e-150 -> -1e-150 +expm10024 expm1 -1e-20 -> -1e-20 + +-- moderate sized values, where direct evaluation runs into trouble +expm10100 expm1 1e-10 -> 1.0000000000500000e-10 +expm10101 expm1 -9.9999999999999995e-08 -> -9.9999995000000163e-8 +expm10102 expm1 3.0000000000000001e-05 -> 3.0000450004500034e-5 +expm10103 expm1 -0.0070000000000000001 -> -0.0069755570667648951 +expm10104 expm1 -0.071499208740094633 -> -0.069002985744820250 +expm10105 expm1 -0.063296004180116799 -> -0.061334416373633009 +expm10106 expm1 0.02390954035597756 -> 0.024197665143819942 +expm10107 expm1 0.085637352649044901 -> 0.089411184580357767 +expm10108 expm1 0.5966174947411006 -> 0.81596588596501485 +expm10109 expm1 0.30247206212075139 -> 0.35319987035848677 +expm10110 expm1 0.74574727375889516 -> 1.1080161116737459 +expm10111 expm1 0.97767512926555711 -> 1.6582689207372185 +expm10112 expm1 0.8450154566787712 -> 1.3280137976535897 +expm10113 expm1 -0.13979260323125264 -> -0.13046144381396060 +expm10114 expm1 -0.52899322039643271 -> -0.41080213643695923 +expm10115 expm1 -0.74083261478900631 -> -0.52328317124797097 +expm10116 expm1 -0.93847766984546055 -> -0.60877704724085946 +expm10117 expm1 10.0 -> 22025.465794806718 +expm10118 expm1 27.0 -> 532048240600.79865 +expm10119 expm1 123 -> 2.6195173187490626e+53 +expm10120 expm1 -12.0 -> -0.99999385578764666 +expm10121 expm1 -35.100000000000001 -> -0.99999999999999944 + +-- extreme negative values +expm10201 expm1 -37.0 -> -0.99999999999999989 +expm10200 expm1 -38.0 -> -1.0 +expm10210 expm1 -710.0 -> -1.0 +-- the formula expm1(x) = 2 * sinh(x/2) * exp(x/2) doesn't work so +-- well when exp(x/2) is subnormal or underflows to zero; check we're +-- not using it! +expm10211 expm1 -1420.0 -> -1.0 +expm10212 expm1 -1450.0 -> -1.0 +expm10213 expm1 -1500.0 -> -1.0 +expm10214 expm1 -1e50 -> -1.0 +expm10215 expm1 -1.79e308 -> -1.0 + +-- extreme positive values +expm10300 expm1 300 -> 1.9424263952412558e+130 +expm10301 expm1 700 -> 1.0142320547350045e+304 +expm10302 expm1 709.78271289328393 -> 1.7976931346824240e+308 +expm10303 expm1 709.78271289348402 -> inf overflow +expm10304 expm1 1000 -> inf overflow +expm10305 expm1 1e50 -> inf overflow +expm10306 expm1 1.79e308 -> inf overflow diff --git a/Lib/test/test_math.py b/Lib/test/test_math.py index 2052430..5ae5d3a 100644 --- a/Lib/test/test_math.py +++ b/Lib/test/test_math.py @@ -984,17 +984,16 @@ class MathTests(unittest.TestCase): if math.isnan(expected) and math.isnan(got): continue if not math.isnan(expected) and not math.isnan(got): - # we use different closeness criteria for - # different functions. - if fn == 'gamma': - accuracy_failure = ulps_check(expected, got, 20) - elif fn == 'lgamma': + if fn == 'lgamma': + # we use a weaker accuracy test for lgamma; + # lgamma only achieves an absolute error of + # a few multiples of the machine accuracy, in + # general. accuracy_failure = acc_check(expected, got, rel_err = 5e-15, abs_err = 5e-15) else: - raise ValueError("don't know how to check accuracy " - "for this function") + accuracy_failure = ulps_check(expected, got, 20) if accuracy_failure is None: continue |