mirror of
https://github.com/python/cpython.git
synced 2025-11-19 10:46:17 +00:00
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. ........
This commit is contained in:
parent
ef1992b9fb
commit
664b511c0a
13 changed files with 162 additions and 10 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue