python-2.5.2/win32/Lib/test/test_math.py
changeset 0 ae805ac0140d
equal deleted inserted replaced
-1:000000000000 0:ae805ac0140d
       
     1 # Python test set -- math module
       
     2 # XXXX Should not do tests around zero only
       
     3 
       
     4 from test.test_support import TestFailed, verbose
       
     5 
       
     6 seps='1e-05'
       
     7 eps = eval(seps)
       
     8 print 'math module, testing with eps', seps
       
     9 import math
       
    10 
       
    11 def testit(name, value, expected):
       
    12     if abs(value-expected) > eps:
       
    13         raise TestFailed, '%s returned %f, expected %f'%\
       
    14               (name, value, expected)
       
    15 
       
    16 print 'constants'
       
    17 testit('pi', math.pi, 3.1415926)
       
    18 testit('e', math.e, 2.7182818)
       
    19 
       
    20 print 'acos'
       
    21 testit('acos(-1)', math.acos(-1), math.pi)
       
    22 testit('acos(0)', math.acos(0), math.pi/2)
       
    23 testit('acos(1)', math.acos(1), 0)
       
    24 
       
    25 print 'asin'
       
    26 testit('asin(-1)', math.asin(-1), -math.pi/2)
       
    27 testit('asin(0)', math.asin(0), 0)
       
    28 testit('asin(1)', math.asin(1), math.pi/2)
       
    29 
       
    30 print 'atan'
       
    31 testit('atan(-1)', math.atan(-1), -math.pi/4)
       
    32 testit('atan(0)', math.atan(0), 0)
       
    33 testit('atan(1)', math.atan(1), math.pi/4)
       
    34 
       
    35 print 'atan2'
       
    36 testit('atan2(-1, 0)', math.atan2(-1, 0), -math.pi/2)
       
    37 testit('atan2(-1, 1)', math.atan2(-1, 1), -math.pi/4)
       
    38 testit('atan2(0, 1)', math.atan2(0, 1), 0)
       
    39 testit('atan2(1, 1)', math.atan2(1, 1), math.pi/4)
       
    40 testit('atan2(1, 0)', math.atan2(1, 0), math.pi/2)
       
    41 
       
    42 print 'ceil'
       
    43 testit('ceil(0.5)', math.ceil(0.5), 1)
       
    44 testit('ceil(1.0)', math.ceil(1.0), 1)
       
    45 testit('ceil(1.5)', math.ceil(1.5), 2)
       
    46 testit('ceil(-0.5)', math.ceil(-0.5), 0)
       
    47 testit('ceil(-1.0)', math.ceil(-1.0), -1)
       
    48 testit('ceil(-1.5)', math.ceil(-1.5), -1)
       
    49 
       
    50 print 'cos'
       
    51 testit('cos(-pi/2)', math.cos(-math.pi/2), 0)
       
    52 testit('cos(0)', math.cos(0), 1)
       
    53 testit('cos(pi/2)', math.cos(math.pi/2), 0)
       
    54 testit('cos(pi)', math.cos(math.pi), -1)
       
    55 
       
    56 print 'cosh'
       
    57 testit('cosh(0)', math.cosh(0), 1)
       
    58 testit('cosh(2)-2*cosh(1)**2', math.cosh(2)-2*math.cosh(1)**2, -1) # Thanks to Lambert
       
    59 
       
    60 print 'degrees'
       
    61 testit('degrees(pi)', math.degrees(math.pi), 180.0)
       
    62 testit('degrees(pi/2)', math.degrees(math.pi/2), 90.0)
       
    63 testit('degrees(-pi/4)', math.degrees(-math.pi/4), -45.0)
       
    64 
       
    65 print 'exp'
       
    66 testit('exp(-1)', math.exp(-1), 1/math.e)
       
    67 testit('exp(0)', math.exp(0), 1)
       
    68 testit('exp(1)', math.exp(1), math.e)
       
    69 
       
    70 print 'fabs'
       
    71 testit('fabs(-1)', math.fabs(-1), 1)
       
    72 testit('fabs(0)', math.fabs(0), 0)
       
    73 testit('fabs(1)', math.fabs(1), 1)
       
    74 
       
    75 print 'floor'
       
    76 testit('floor(0.5)', math.floor(0.5), 0)
       
    77 testit('floor(1.0)', math.floor(1.0), 1)
       
    78 testit('floor(1.5)', math.floor(1.5), 1)
       
    79 testit('floor(-0.5)', math.floor(-0.5), -1)
       
    80 testit('floor(-1.0)', math.floor(-1.0), -1)
       
    81 testit('floor(-1.5)', math.floor(-1.5), -2)
       
    82 
       
    83 print 'fmod'
       
    84 testit('fmod(10,1)', math.fmod(10,1), 0)
       
    85 testit('fmod(10,0.5)', math.fmod(10,0.5), 0)
       
    86 testit('fmod(10,1.5)', math.fmod(10,1.5), 1)
       
    87 testit('fmod(-10,1)', math.fmod(-10,1), 0)
       
    88 testit('fmod(-10,0.5)', math.fmod(-10,0.5), 0)
       
    89 testit('fmod(-10,1.5)', math.fmod(-10,1.5), -1)
       
    90 
       
    91 print 'frexp'
       
    92 def testfrexp(name, (mant, exp), (emant, eexp)):
       
    93     if abs(mant-emant) > eps or exp != eexp:
       
    94         raise TestFailed, '%s returned %r, expected %r'%\
       
    95               (name, (mant, exp), (emant,eexp))
       
    96 
       
    97 testfrexp('frexp(-1)', math.frexp(-1), (-0.5, 1))
       
    98 testfrexp('frexp(0)', math.frexp(0), (0, 0))
       
    99 testfrexp('frexp(1)', math.frexp(1), (0.5, 1))
       
   100 testfrexp('frexp(2)', math.frexp(2), (0.5, 2))
       
   101 
       
   102 print 'hypot'
       
   103 testit('hypot(0,0)', math.hypot(0,0), 0)
       
   104 testit('hypot(3,4)', math.hypot(3,4), 5)
       
   105 
       
   106 print 'ldexp'
       
   107 testit('ldexp(0,1)', math.ldexp(0,1), 0)
       
   108 testit('ldexp(1,1)', math.ldexp(1,1), 2)
       
   109 testit('ldexp(1,-1)', math.ldexp(1,-1), 0.5)
       
   110 testit('ldexp(-1,1)', math.ldexp(-1,1), -2)
       
   111 
       
   112 print 'log'
       
   113 testit('log(1/e)', math.log(1/math.e), -1)
       
   114 testit('log(1)', math.log(1), 0)
       
   115 testit('log(e)', math.log(math.e), 1)
       
   116 testit('log(32,2)', math.log(32,2), 5)
       
   117 testit('log(10**40, 10)', math.log(10**40, 10), 40)
       
   118 testit('log(10**40, 10**20)', math.log(10**40, 10**20), 2)
       
   119 
       
   120 print 'log10'
       
   121 testit('log10(0.1)', math.log10(0.1), -1)
       
   122 testit('log10(1)', math.log10(1), 0)
       
   123 testit('log10(10)', math.log10(10), 1)
       
   124 
       
   125 print 'modf'
       
   126 def testmodf(name, (v1, v2), (e1, e2)):
       
   127     if abs(v1-e1) > eps or abs(v2-e2):
       
   128         raise TestFailed, '%s returned %r, expected %r'%\
       
   129               (name, (v1,v2), (e1,e2))
       
   130 
       
   131 testmodf('modf(1.5)', math.modf(1.5), (0.5, 1.0))
       
   132 testmodf('modf(-1.5)', math.modf(-1.5), (-0.5, -1.0))
       
   133 
       
   134 print 'pow'
       
   135 testit('pow(0,1)', math.pow(0,1), 0)
       
   136 testit('pow(1,0)', math.pow(1,0), 1)
       
   137 testit('pow(2,1)', math.pow(2,1), 2)
       
   138 testit('pow(2,-1)', math.pow(2,-1), 0.5)
       
   139 
       
   140 print 'radians'
       
   141 testit('radians(180)', math.radians(180), math.pi)
       
   142 testit('radians(90)', math.radians(90), math.pi/2)
       
   143 testit('radians(-45)', math.radians(-45), -math.pi/4)
       
   144 
       
   145 print 'sin'
       
   146 testit('sin(0)', math.sin(0), 0)
       
   147 testit('sin(pi/2)', math.sin(math.pi/2), 1)
       
   148 testit('sin(-pi/2)', math.sin(-math.pi/2), -1)
       
   149 
       
   150 print 'sinh'
       
   151 testit('sinh(0)', math.sinh(0), 0)
       
   152 testit('sinh(1)**2-cosh(1)**2', math.sinh(1)**2-math.cosh(1)**2, -1)
       
   153 testit('sinh(1)+sinh(-1)', math.sinh(1)+math.sinh(-1), 0)
       
   154 
       
   155 print 'sqrt'
       
   156 testit('sqrt(0)', math.sqrt(0), 0)
       
   157 testit('sqrt(1)', math.sqrt(1), 1)
       
   158 testit('sqrt(4)', math.sqrt(4), 2)
       
   159 
       
   160 print 'tan'
       
   161 testit('tan(0)', math.tan(0), 0)
       
   162 testit('tan(pi/4)', math.tan(math.pi/4), 1)
       
   163 testit('tan(-pi/4)', math.tan(-math.pi/4), -1)
       
   164 
       
   165 print 'tanh'
       
   166 testit('tanh(0)', math.tanh(0), 0)
       
   167 testit('tanh(1)+tanh(-1)', math.tanh(1)+math.tanh(-1), 0)
       
   168 
       
   169 # RED_FLAG 16-Oct-2000 Tim
       
   170 # While 2.0 is more consistent about exceptions than previous releases, it
       
   171 # still fails this part of the test on some platforms.  For now, we only
       
   172 # *run* test_exceptions() in verbose mode, so that this isn't normally
       
   173 # tested.
       
   174 
       
   175 def test_exceptions():
       
   176     print 'exceptions'
       
   177     try:
       
   178         x = math.exp(-1000000000)
       
   179     except:
       
   180         # mathmodule.c is failing to weed out underflows from libm, or
       
   181         # we've got an fp format with huge dynamic range
       
   182         raise TestFailed("underflowing exp() should not have raised "
       
   183                          "an exception")
       
   184     if x != 0:
       
   185         raise TestFailed("underflowing exp() should have returned 0")
       
   186 
       
   187     # If this fails, probably using a strict IEEE-754 conforming libm, and x
       
   188     # is +Inf afterwards.  But Python wants overflows detected by default.
       
   189     try:
       
   190         x = math.exp(1000000000)
       
   191     except OverflowError:
       
   192         pass
       
   193     else:
       
   194         raise TestFailed("overflowing exp() didn't trigger OverflowError")
       
   195 
       
   196     # If this fails, it could be a puzzle.  One odd possibility is that
       
   197     # mathmodule.c's macros are getting confused while comparing
       
   198     # Inf (HUGE_VAL) to a NaN, and artificially setting errno to ERANGE
       
   199     # as a result (and so raising OverflowError instead).
       
   200     try:
       
   201         x = math.sqrt(-1.0)
       
   202     except ValueError:
       
   203         pass
       
   204     else:
       
   205         raise TestFailed("sqrt(-1) didn't raise ValueError")
       
   206 
       
   207 if verbose:
       
   208     test_exceptions()