a ze]@sddlmZmZmZddlmZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZdZedZedZedZejjZejjZd\ZZeed kZed krejdZneZe j !epe j"Z#e j $e#d Z%e j $e#d Z&d dZ'ddZ(ddZ)ddZ*ddZ+ddZ,ddZ-d+ddZ.Gdd d Z/Gd!d"d"e0Z1Gd#d$d$e2Z3Gd%d&d&ej4Z5Gd'd(d(ej4Z6d)d*Z7ed kre7dS),) run_unittestverboserequires_IEEE_754)supportNgh㈵>naninf-inf)7yACg):@g7yAC__main__zmath_testcases.txtzcmath_testcases.txtcCs.tdtd|d}|dkr*|d}|S)aConvert a non-NaN float x to an integer, in such a way that adjacent floats are converted to adjacent integers. Then abs(ulps(x) - ulps(y)) gives the difference in ulps between two floats. The results from this function will only make sense on platforms where native doubles are represented in IEEE 754 binary64 format. Note: 0.0 and -0.0 are converted to 0 and -1, respectively. zS)zFactorial of nonnegative integer n, via "Binary Split Factorial Formula" described at http://www.luschny.de/math/factorial/binarysplitfact.html r)reversedrange bit_lengthrr)rinnerZouterirrr py_factorial_s * rcCsLtt|t|}t||}||ks0||kr4dSd}|||||SdS)zGiven finite floats `expected` and `got`, check that they're approximately equal to within the given number of ulps or the given absolute tolerance, whichever is bigger. Returns None on success and an error message on failure. NzAerror = {:.3g} ({:d} ulps); permitted error = {:.3g} or {:d} ulps)absrformat)expectedgotulp_tolabs_tolZ ulp_errorZ abs_errorfmtrrr ulp_abs_checkjs  r%c cst|}|D]x}d|vr,|d|d}|s6q|d\}}|\}}}|}|d} |dd} ||t|t| | fVqWdn1s0YdS)zParse a file with test values -- starts a comment blank lines, or lines containing only a comment, are ignored other lines are expected to have the form id fn arg -> expected [flag]* --N->rr)openindexstripsplitfloat) fnamefplinelhsrhsidfnarg rhs_piecesexpflagsrrrparse_mtestfile|s  r8c cst|}|D]}|ds|s&q|d\}}|\}}}}|} | d| d} } | dd} ||t|t|t| t| | fVqWdn1s0YdS)zParse a file with test values Empty lines or lines starting with -- are ignored yields id, fn, arg_real, arg_imag, exp_real, exp_imag r&r'rrN)r( startswithr*r+r,) r-r.r/r0r1r2r3Zarg_realZarg_imagr5Zexp_realZexp_imagr7rrrparse_testfiles    r;cCs||kr dSd}t|tr.t|tr.t|}nt|trJt|trJt|}t|trt|trt|rxt|rxd}n$t|st|rnt||||}|durd}|||}|d|7}|SdSdS)aCompare arguments expected and got, as floats, if either is a float, using a tolerance expressed in multiples of ulp(expected) or absolutely (if given and greater). As a convenience, when neither argument is a float, and for non-finite floats, exact equality is demanded. Also, nan==nan as far as this function is concerned. Returns None on success and an error message on failure. Nz not equalzexpected {!r}, got {!r}z ({})) isinstancer,intmathisnanisinfr%r)r r!r"r#failurefail_fmtZfail_msgrrr result_checks&  rEc@seZdZddZddZdS) FloatLikecCs ||_dSNvalueselfrIrrr__init__szFloatLike.__init__cCs|jSrGrHrKrrr __float__szFloatLike.__float__N)__name__ __module__ __qualname__rLrNrrrrrFsrFc@s eZdZdS) IntSubclassNrOrPrQrrrrrRsrRc@seZdZddZddZdS) MyIndexablecCs ||_dSrGrHrJrrrrLszMyIndexable.__init__cCs|jSrGrHrMrrr __index__szMyIndexable.__index__NrOrPrQrLrUrrrrrTsrTc@sneZdZdddZddZddZd d Zd d Zd dZddZ ddZ ddZ ddZ e ddZddZeejdkoedvdddZd d!Zd"d#Zd$d%Zd&d'Zd(d)Zejd*d+Zd,d-Zd.d/Zd0d1Z e ee!d2d3d4Z"d5d6Z#d7d8Z$d9d:Z%d;d<Z&d=d>Z'd?d@Z(dAdBZ)dCdDZ*e dEdFZ+e e,dGddHdIZ-dJdKZ.dLdMZ/dNdOZ0dPdQZ1e dRdSZ2dTdUZ3dVdWZ4dXdYZ5dZd[Z6d\d]Z7e d^d_Z8d`daZ9dbdcZ:dddeZ;dfdgZe?e@dldmdnZAe dodpZBe dqdrZCdsdtZDdudvZEdwdxZFe dydzZGe d{d|ZHd}d~ZIddZJddZKdS) MathTestsr<r=cCs,t||||}|dur(|d||dS)aaCompare arguments expected and got, as floats, if either is a float, using a tolerance expressed in multiples of ulp(expected) or absolutely, whichever is greater. As a convenience, when neither argument is a float, and for non-finite floats, exact equality is demanded. Also, nan==nan in this function. Nz{}: {})rEfailr)rKnamer!r r"r#rCrrrftests zMathTests.ftestcCs8|dtjd|dtjd|tjdtjdS)Npig-DT! @egiW @r9)rZr@r[r\ assertEqualtaurMrrr testConstantsszMathTests.testConstantscCs|ttj|dtdtj|dtdtjd|dtdd|ttjt|ttjt|ttjdt |ttjdt | t tt dS)Nzacos(-1)zacos(0)rr9zacos(1)r) assertRaises TypeErrorr@acosrZr[ ValueErrorINFNINFeps assertTruerANANrMrrrtestAcosszMathTests.testAcoscCs|ttj|dtdd|dtdd|ttjd|ttjd|ttt|ttjt| t tt dS)Nzacosh(1)rrzacosh(2)r9g5qB?r`) rarbr@acoshrZrdr]rerfrhrArirMrrr testAcosh szMathTests.testAcoshcCs|ttj|dtdtj d|dtdd|dtdtjd|ttjt|ttjt|ttjdt |ttjdt | t tt dS)Nzasin(-1)r`r9zasin(0)rzasin(1)r) rarbr@asinrZr[rdrerfrgrhrArirMrrrtestAsinszMathTests.testAsincCs|ttj|dtdd|dtdd|dtdd|ttt|ttt|t tt dS) Nzasinh(0)rzasinh(1)rg'ya64?z asinh(-1)r`g'ya64) rarbr@asinhrZr]rerfrhrArirMrrr testAsinh"szMathTests.testAsinhcCs|ttj|dtdtj d|dtdd|dtdtjd|dtttjd |d tttj d |t tt dS) Nzatan(-1)r`zatan(0)rzatan(1)rz atan(inf)r9z atan(-inf)) rarbr@atanrZr[rerfrhrArirMrrrtestAtan+szMathTests.testAtancCs|ttj|dtdd|dtdd|dtdd|ttjd |ttjd |ttjt|ttjt| t tt dS) Nzatanh(0)rz atanh(0.5)?g z?z atanh(-0.5)g zrr`) rarbr@rrrZatanhrdrerfrhrArirMrrr testAtanh4szMathTests.testAtanhcCs|ttj|dtddtj d|dtddtj d|dtddd|d tddtjd|d tddtjd|d td ttj|d td dtj|dtd dtj|td d d |td dd |td td | t td t |dtdttj |dtddtj |dtddtj |tdd d|tddd|tdtd| t tdt |dttttjdd|dttdtjd|dttdtjd|dttd tjd|dttdtjd|dttttjd| t ttt |dttttj dd|dttdtj d|dttdtj d|dttd tj d|d ttdtj d|d!ttttj d| t ttt |d"tdttj|d#tddtjd|d$tdd tjd|tdtd | t tdt |d%tdttj |d&tddtj d|d'tdd tj d|tdtd| t tdt | t tt t| t tt d| t tt d| t tt d | t tt d| t tt t| t tt t dS)(Nz atan2(-1, 0)r`rr9z atan2(-1, 1)rrqz atan2(0, 1)z atan2(1, 1)z atan2(1, 0)zatan2(0., -inf)r=zatan2(0., -2.3)ffffffzatan2(0., -0.)ffffff@zatan2(-0., -inf)zatan2(-0., -2.3)zatan2(-0., -0.)zatan2(inf, -inf)zatan2(inf, -2.3)zatan2(inf, -0.)zatan2(inf, 0.)zatan2(inf, 2.3)zatan2(inf, inf)zatan2(-inf, -inf)zatan2(-inf, -2.3)zatan2(-inf, -0.)zatan2(-inf, 0.)zatan2(-inf, 2.3)zatan2(-inf, inf)zatan2(2.3, -inf)zatan2(2.3, -0.)zatan2(2.3, 0.)zatan2(-2.3, -inf)zatan2(-2.3, -0.)zatan2(-2.3, 0.)) rarbr@atan2rZr[rfr]rerhrArirMrrr testAtan2?sf "zMathTests.testAtan2cCsf|ttj|tttd|tdd|tdd|tdd|tdd|tdd |td d |td d|td dGd dd}Gdddt}Gddd}|t|d|t|d|ttdd|ttj||}dd|_ |ttj||ttj|ddS)Nrtr??r9rurr`r=ryc@seZdZddZdS)z$MathTests.testCeil..TestCeilcSsdSN*rrMrrr__ceil__sz-MathTests.testCeil..TestCeil.__ceil__NrOrPrQrrrrrTestCeilsrc@seZdZddZdS)z%MathTests.testCeil..FloatCeilcSsdSrrrMrrrrsz.MathTests.testCeil..FloatCeil.__ceil__Nrrrrr FloatCeilsrc@s eZdZdS)z&MathTests.testCeil..TestNoCeilNrSrrrr TestNoCeilsrrg@E@+cWs|SrGrargsrrrz$MathTests.testCeil..) rarbr@ceilr]r?typer,rFr)rKrrrtrrrtestCeil|s* zMathTests.testCeilcCs|tddd|tddd|tddd|tddd|td d d |ttj|tddd|tdd d|ttdt|ttd t|ttdt|ttd t|tdtd|tdtd|tttt|tttt|tttt|tttt|ttt d|ttt t|ttt t|ttt t |t ttt |t td t d dS) Nrrr~r=irr{@@ry@) r]r@copysignrarbrerfrhrArirBrrMrrr testCopysigns0zMathTests.testCopysigncCs|ttj|jdttj ddtdd|dtdd|jdttjddtdd|dttjd z0|ttt |ttt Wn2t y|t tjt |t tjt Yn0|ttt dS) Nz cos(-pi/2)r9rrr#zcos(0)z cos(pi/2)zcos(pi)r`) rarbr@cosrZr[ulprhrArerfrdrirMrrrtestCoss&$ zMathTests.testCoswin32)ZARMZARM64zEWindows UCRT is off by 2 ULP this test requires accuracy within 1 ULPcCs|ttj|dtdd|dtddtddd|ttt|ttt|t tt dS)Nzcosh(0)rrzcosh(2)-2*cosh(1)**2r9r`) rarbr@coshrZr]rerfrhrArirMrrrtestCoshs &zMathTests.testCoshcCsr|ttj|dttjd|dttjdd|dttj dd|d td d dS) Nz degrees(pi)gf@z degrees(pi/2)r9gV@zdegrees(-pi/4)rqgFz degrees(0)r)rarbr@degreesrZr[rMrrr testDegreess zMathTests.testDegreescCs|ttj|dtddtj|dtdd|dtdtj|ttt|ttd| t tt |t tjddS) Nzexp(-1)r`rzexp(0)rzexp(1)r=@B) rarbr@r6rZr\r]rerfrhrAri OverflowErrorrMrrrtestExpszMathTests.testExpcCsN|ttj|dtdd|dtdd|dtdddS)Nzfabs(-1)r`rzfabs(0)rzfabs(1))rarbr@fabsrZrMrrrtestFabsszMathTests.testFabscCs|tddd}tddD]4}||9}|t|||t|t|q |ttjd|ttjdd dS)Nrrr` d)r]r@ factorialrrrard)rKtotalrrrr testFactorialszMathTests.testFactorialcCs*|t"|tddWdn1s20Y|t |ttjdWdn1sl0Y|t |ttjdWdn1s0Y|t |ttjdWdn1s0Y|ttjt d|ttjt d|ttjddS)N@xg@r}Ô%I5z5.2) assertWarnsDeprecationWarningr]r@rrardrbdecimalDecimalrMrrrtestFactorialNonIntegerss 0 . . .z"MathTests.testFactorialNonIntegerscCsR|ttjdd|t |ttjdWdn1sD0YdS)Nrr}Ô%IT)rarr@rrrrMrrrtestFactorialHugeInputss z!MathTests.testFactorialHugeInputscCsB|ttj|tttd|tdd|tdd|tdd|tdd|tdd|td d Gd d d }Gd ddt}Gddd}|t|d|t|d|ttdd|ttj||}dd|_ |ttj||ttj|ddS)Nrtrr~rrrur`rrc@seZdZddZdS)z&MathTests.testFloor..TestFloorcSsdSrrrMrrr __floor__sz0MathTests.testFloor..TestFloor.__floor__NrOrPrQrrrrr TestFloorsrc@seZdZddZdS)z'MathTests.testFloor..FloatFloorcSsdSrrrMrrrrsz1MathTests.testFloor..FloatFloor.__floor__Nrrrrr FloatFloorsrc@s eZdZdS)z(MathTests.testFloor..TestNoFloorNrSrrrr TestNoFloor!srrg33333D@)cWs|SrGrrrrrr)rz%MathTests.testFloor..) rarbr@floorr]r?rr,rFr)rKrrrrrrr testFloors& zMathTests.testFloorcCs|ttj|dtddd|dtddd|dtddd |d td dd |d td dd |dtd dd|tttd |ttd t|tttt|ttjd d|ttjt d |ttjt d |ttjt d| tdt d| tdt d| tdt d| tdt d| tddd| tdt ddS)Nz fmod(10, 1)rrr=z fmod(10, 0.5)rtz fmod(10, 1.5)rr~z fmod(-10, 1)ryzfmod(-10, 0.5)zfmod(-10, 1.5)rr) rarbr@fmodrZrhrArirdrerfr]rMrrrtestFmod-s(zMathTests.testFmodcsttjfdd}|dtdd|dtdd|d td d |d td dttdtttdtttt ddS)NcsB||\}}\}}t||tks*||kr>d|||fdSNz%s returned %r, expected %rrrgrX)rYresultr mantr6ZemantZeexprMrr testfrexpFs z&MathTests.testFrexp..testfrexpz frexp(-1)r`)rurzfrexp(0)rrrzfrexp(1)r)rtrzfrexp(2)r9)rtr9) rarbr@frexpr]rerfrhrAri)rKrrrMr testFrexpCs zMathTests.testFrexpz2fsum is not exact on machines with double roundingcs8ddlm}|j|jfdd}gdfdgdfgddfgdd fgd d fgd d fgddfddtddDtdfddtddDtdfgddfgddfddtdddDdgtdfg }d dtdD|fd!dtd"Dd" gd ft|D]x\}\}}zt |}WnNt yl| d#|||fYn(t y| d$|||fYn0|||q*dd%lm}m} m} td"D]r} gd&d'}d} td(D],}| d|d)| } | | 7} || q| |||} |||t |qdS)*Nr) float_infocsd\}}|D]Z}t|\}}tt||}}||krR|||K}|}n |||K}||7}q tttt|d|}|dkrd|d>}|d|t||@o|d|d@}||7}t||S)zFull precision summation. Compute sum(iterable) without any intermediate accumulation of error. Based on the 'lsum' function at http://code.activestate.com/recipes/393090/ rr9rrr{) r@rr?ldexpmaxlenbinrbool)iterableZtmantZtexprrr6tailh)etinymant_digrrmsumhs   " (z MathTests.testFsum..msumr=)rr~r0.++gd~QJrgd~Qr)@Crugg?C)rr~9g@C)g@Cr~rg@C)g?Crtgrz&MathTests.testFsum..riz0x1.df11f45f4e61ap+2cSsg|]}d||qS)rrrrrrrrz-0x1.62a2af1bd3624p-1)r r~gؗҜ; *Q!/ 61^f^@U@)r@gcdr]rarbrT)rKrrycabrrrtestGcdsNzMathTests.testGcdc Csddlm}ddlm}tj}tjtjtdt dt df}t t |dD]8}| ||d|ttdd |d|DqR||d d d ||d dd|||d |dd|||d d|dd|dd||tdtdtdtdtd||ddd||dd||d|dtd|d||ddd|ddd|t|ddWdn1s0Y|t|dddWdn1s0Ydtjjd}|ttf|d|Wdn1s,0Y||tt||dtt||dtt||dtt||ttt||ttt||ttt||ttt||t tt||t t t||dt t|t|t|t|dt|t|td|t|dt|t|tt|t|ttd}t dD]&}|||g||t|qt dD]2} td| } |td | d| d| qdS)!NrrFractionr @g@rcss|]}|dVqdS)r9Nr)rrrrr rz&MathTests.testHypot..g(@r*@rr< rr{r=%%@r~ryrrtr皙?string皙@rrrrq) rr fractionsr r@hypotr\r[sqrtgammasinrrassertAlmostEqualsumr]rrrarbrr max_10_exprdrrerirfrhrA FLOAT_MAX FLOAT_MIN) rKrr rrrint_too_big_for_float fourthmaxrr6scalerrr testHypotsl  $$,   * ,* $  zMathTests.testHypotc Csddlm}ddlm}tj}tj}||ddd||dddtd D]h}td D]Z}t d d t|D}t d d t|D}| ||||t dd t ||Dq\qP||gdgdd||t gdt gdd||ddd||ddd|||d|df|d|df|d|||dd|ddf|dd|ddf|dd||dd|d||ddd||ddd|d td |d!d"|d td |d"d!||d#d$|d%d$Gd&d'd't } ||| ddd|t|dd(d)Wdn1sZ0Y|t|dWdn1s0Y|t|dd(d*Wdn1s0Y|t|ddWdn1s0Y|t|d+dWdn1s20Y|t|d,d-Wdn1sh0Y|t|dd.Wdn1s0Y|t|d/d0Wdn1s0Yd1tjjd } |ttf|d| fd2Wdn1s"0Y|ttf|d2d| fWdn1s`0Ytd3D]6}tt}}|||f|ft||qrtd4d5dd6ttg} tj| d7d8D]~}tj| d7d8D]h}d9d:t ||D} tttj| r||||tn(tttj | r|!t |||qܐqt"d;} tdD]P}| f|}d"|}||||| t|||||| t|qZtdD]V}t#d|}d<|d7|f}d=}|t||d ||t||d |qdS)>Nrrr )r~rr)rrrr)rr9r{)rqr9r` r<css|]}tddVqdSr<Nruniformrkrrrr 9rz%MathTests.testDist..css|]}tddVqdSr$r&r(rrrr :rcss|]\}}||dVqdS)rNrrZpxZqxrrrr =r)g,@r~)rrr )r)r9rr+rr9r,r)TTFTF)TFTTFr)g*@g)@g r=rr~)ry)r=)rrrt)rrr)rrtrc@s eZdZdS)zMathTests.testDist..TNrSrrrrT_sr-)rqr<r)pq)rr#)rrr)rr9r{rq)r<rr)rqr<rrabcZxyzr)r9r{rryrr{)repeatcSsg|]\}}||qSrrr*rrrrrz&MathTests.testDist..rrq)r=r=)$rrrr r@distrr]rtuplerrzipiterrrarbrdrrrrrrrfreri itertoolsproductanymaprBrArhrr)rKDFr4rrrr.r/r-rvaluesZdiffsr rr6r!rrrtestDist*s    "., , ( , * * * * *.. "     zMathTests.testDistc Cs4ttdttddddtddDdd d d g}|D]r}|j|d Rt|}|t|t||||| ||d |d WdqB1s0YqB| t tdWdn1s0Ytd}|t|t| |d td}|t|t| |dGdddt }t|d}|t|t| |d| t t|dWdn1s0Yddtddddg}|D]j}|j|d F| tt|Wdn1s0YWdn1s"0YqdS)NriX>i(FcSs(g|] }tddD]}d||qqS)i(r9)r)rr\rrrrrrz'MathTests.testIsqrt..<rr{i'rirHrr`TFrc@seZdZddZddZdS)z(MathTests.testIsqrt..IntegerLikecSs ||_dSrGrHrJrrrrLsz1MathTests.testIsqrt..IntegerLike.__init__cSs|jSrGrHrMrrrrUsz2MathTests.testIsqrt..IntegerLike.__index__NrVrrrr IntegerLikesrBirr za stringz3.5y @gY@r)listrsubTestr@isqrtassertIsrr?assertLessEqualZ assertLessrardr]objectrrrb)rKrrIrrBZ bad_valuesrrr testIsqrtsF   8 (      . zMathTests.testIsqrtcCsNtj}||ddd||ddd||ddd||ddd||ddd||ddd||ddd||ddd||dd d ||d d d ||d d dd}d}dD]}||}||}|||}||||||||||||| |||||| ||||| |||| ||||| | |||| | |q||d||dd||d d||dd dd||ddd d|t|d|t|dd |t|dd|t|ddd||tdtd d dS)Nrrr`rrriYrriHrrrl ,`aUx-xB:Vn Ldblme%Y%l};T^ )rl|/Kr2ri7rr)r@lcmr]rarbrT)rKrKrrrrrdrrrtest_lcmsP zMathTests.test_lcmc Cs:|ttj|dtddd|dtddd|dtddd|d tddd |ttjd d |ttjd d |td dd|td dd|ttdt|ttdt| t tt ddddddfD]0}|tt| t|tt| t|td | d|td | d|td| d|td| d| t tt | |ttjd ||ttjd ||td|d|td|d|tt|t|tt|t| t tt |qdS)Nz ldexp(0,1)rrz ldexp(1,1)r9z ldexp(1,-1)r`rtz ldexp(-1,1)rr~rrir=ryi+ild(  Fx:^Vrr@) rarbr@rrZrr]rerfrhrArirKrrrr testLdexps6zMathTests.testLdexpcCs|ttj|dtdtjd|dtdd|dttjd|dtdd d |d td d d d |dtd d dd |dtd dd|ttjd|ttjd d |ttjt|tt t | t tt dS)Nzlog(1/e)rr`zlog(1)rzlog(e)z log(32,2)rr9r<zlog(10**40, 10)rr@zlog(10**40, 10**20)rOz log(10**1000)rgO+@r) rarbr@logrZr\rdrfr]rerhrArirMrrrtestLogszMathTests.testLogcCsh|ttjdddddfD] }|t|tt|q |ttjd|tttdS)Nr9Zi,r`) rarbr@log1prr,rdr]rerPrrr testLog1p,s zMathTests.testLog1pcCs|ttj|tdd|tdd|tdd|tddd|tdd d |tdd d |ttjd |ttjt|ttt dS)Nrr=r9r~rqrig@g@ig@@r) rarbr@log2r]rdrfrhrArirMrrrtestLog23szMathTests.testLog2rcCs8ddtddD}ddtddD}|||dS)NcSsg|]}ttd|qSr)r@rXrrrrrrJrz+MathTests.testLog2Exact..rrWcSsg|] }t|qSrr,rrrrrKr)rr])rKrr rrr testLog2ExactEszMathTests.testLog2ExactcCs|ttj|dtdd|dtdd|dtdd|d tdd d |ttjd |ttjdd  |ttjt|tt t | t tt dS) Nz log10(0.1)皙?r`zlog10(1)rrz log10(10)rzlog10(10**1000)rg@@r) rarbr@log10rZrdrfr]rRrerhrArirMrrr testLog10NszMathTests.testLog10csttjfdd}|dtdd|dtddttd tfttd tftt}t |d t |d dS) NcsF||\}}\}}t||tks.t||rBd|||fdSrr)rYrr Zv1Zv2e1e2rMrrtestmodf]s z$MathTests.testModf..testmodfz modf(1.5)r)rtr~z modf(-1.5)r)rurr=ryrr) rarbr@modfr]rerfrirhrA)rKraZmodf_nanrrMrtestModfZs  zMathTests.testModfcCs|ttj|dtddd|dtddd|dtddd|dtddd |ttdt|ttdt|tdtd |tdtd |t tt d|t tdt |t tdt |tdt d|td td |td d d |td d d |td dd |td d d |td dd |t tjd d|t tjd d|t tjd d|t tjd t|t td t |tttt|ttd t|ttd t|ttdt|ttd d |ttdd |ttdd |ttdd |ttdd |tttd |t ttt |tdtd |tdd d|tdd d |tddd |tdd d |tddd |t tjdd|t tjdd|t tjdd|t tjdt|t tdt |tttt|ttd t|ttd t|ttdt|ttd d |ttdd |ttdd |ttdd |ttdd|tttd |t ttt |tdtd |tdd d|t tjdd |tddd |tdd d |tddd |tddd |t tjdd|tddd|tdtd |t tdt |td td |td d d |td d d |td dd |td d d |td dd |td dd |td dd |td dd |td td |td t d |td d d |tdd d |tt d d |td dd |tddd |tt dd |t tjdd |t tjdd|tdtd |tdtd |tdtt|tdtt|tdtt|tdtt|tdtd |tdtd |tdtt|tdtt|tdtd |tdtd |tdtd |tdtd |tdtt|tdtt|dtdd d|d tddd!|d"tdd d|d#tdd d |d$tddd |d%tddd&|d'tddd(|d)tddd*|t tjdd&|t tjdd dS)+Nzpow(0,1)rrzpow(1,0)zpow(2,1)r9z pow(2,-1)r`rtr~r=rrzrrygrxrrg.ggffffff?r?r\ggggffffffz (-2.)**3.g z (-2.)**2.rz (-2.)**1.z (-2.)**0.z (-2.)**-0.z (-2.)**-1.ruz (-2.)**-2.g?z (-2.)**-3.g) rarbr@powrZr]rerfrhrArirdrMrrrtestPowmszMathTests.testPowcCsr|ttj|dtdtj|dtdtjd|dtdtj d|d td d dS) Nz radians(180)z radians(90)rTr9z radians(-45)irqz radians(0)r)rarbr@radiansrZr[rMrrr testRadianss zMathTests.testRadiansc sddlmfdd}gd}|D]}j|dh|\}}}t|}t|}t|} |||| t||} | | Wdq&1s0Yq&td} t dd D]`} | dkrq| | }t d D]@} | | }t||} |||| t| |} || || qqt d d d dt t fD]*}tt |t|t q8dD].}t|t |t|t |qht dd d dt fD]}ttt |Wdn1s0Yttt |Wdn1s0Ytt|d Wdn1sJ0Ytt|d Wdn1s0YqdS)Nrr cs|||}}}t|t|d|||}|t|t|t|dkr||dt|ddS)z Check that r matches remainder(x, y) according to the IEEE 754 specification. Assumes that x, y and r are finite and y is nonzero. r9N)rHrr]r?)rrrZfxZfyfrrr rKrr validate_spec s  z.MathTests.testRemainder..validate_spec)0z -4.0 1 -0.0z -3.8 1 0.8z -3.0 1 -0.0z -2.8 1 -0.8z -2.0 1 -0.0z -1.8 1 0.8z -1.0 1 -0.0z -0.8 1 -0.8z -0.0 1 -0.0z 0.0 1 0.0z 0.8 1 0.8z 1.0 1 0.0z 1.8 1 -0.8z 2.0 1 0.0z 2.8 1 0.8z 3.0 1 0.0z 3.8 1 -0.8z 4.0 1 0.0z&0x0.0p+0 0x1.921fb54442d18p+2 0x0.0p+0z?0x1.921fb54442d18p+0 0x1.921fb54442d18p+2 0x1.921fb54442d18p+0z?0x1.921fb54442d17p+1 0x1.921fb54442d18p+2 0x1.921fb54442d17p+1z?0x1.921fb54442d18p+1 0x1.921fb54442d18p+2 0x1.921fb54442d18p+1z?0x1.921fb54442d19p+1 0x1.921fb54442d18p+2 -0x1.921fb54442d17p+1z?0x1.921fb54442d17p+2 0x1.921fb54442d18p+2 -0x0.0000000000001p+2z00x1.921fb54442d18p+2 0x1.921fb54442d18p+2 0x0p0z?0x1.921fb54442d19p+2 0x1.921fb54442d18p+2 0x0.0000000000001p+2z?0x1.2d97c7f3321d1p+3 0x1.921fb54442d18p+2 0x1.921fb54442d14p+1z?0x1.2d97c7f3321d2p+3 0x1.921fb54442d18p+2 -0x1.921fb54442d18p+1z?0x1.2d97c7f3321d3p+3 0x1.921fb54442d18p+2 -0x1.921fb54442d14p+1z?0x1.921fb54442d17p+3 0x1.921fb54442d18p+2 -0x0.0000000000001p+3z00x1.921fb54442d18p+3 0x1.921fb54442d18p+2 0x0p0z?0x1.921fb54442d19p+3 0x1.921fb54442d18p+2 0x0.0000000000001p+3z?0x1.f6a7a2955385dp+3 0x1.921fb54442d18p+2 0x1.921fb54442d14p+1z?0x1.f6a7a2955385ep+3 0x1.921fb54442d18p+2 0x1.921fb54442d18p+1z?0x1.f6a7a2955385fp+3 0x1.921fb54442d18p+2 -0x1.921fb54442d14p+1z?0x1.1475cc9eedf00p+5 0x1.921fb54442d18p+2 0x1.921fb54442d10p+1z?0x1.1475cc9eedf01p+5 0x1.921fb54442d18p+2 -0x1.921fb54442d10p+1z 1 0.c 0.4z -1 0.c -0.4z 1 -0.c 0.4z -1 -0.c -0.4z 1.4 0.c -0.4z-1.4 0.c 0.4z 1.4 -0.c -0.4z-1.4 -0.c 0.4z$0x1.dp+1023 0x1.4p+1023 0x0.9p+1023z$0x1.ep+1023 0x1.4p+1023 -0x0.ap+1023z$0x1.fp+1023 0x1.4p+1023 -0x0.9p+1023)casez1p-1074irr=ryrrx)rxryr=rzrz)rr rEr+r,rr@ remainderr]hexrrirfre assertIsNaNrard)rKrmZ testcasesrnZx_hexZy_hexZ expected_hexrrr rZtinyrmrIrrlr testRemainder sL ;     4     , , , zMathTests.testRemaindercCs|ttj|dtdd|dttjdd|dttj ddz0|ttt|ttt Wn2t y|t tjt|t tjt Yn0|ttt dS)Nzsin(0)rz sin(pi/2)r9rz sin(-pi/2)r`) rarbr@rrZr[rhrArerfrdrirMrrrtestSins zMathTests.testSincCs|ttj|dtdd|dtddtddd|dtdtdd|ttt|ttt| t tt dS)Nzsinh(0)rzsinh(1)**2-cosh(1)**2rr9r`zsinh(1)+sinh(-1)) rarbr@sinhrZrr]rerfrhrArirMrrrtestSinhs&zMathTests.testSinhcCs|ttj|dtdd|dtdd|dtdd|ttt|ttjd|ttjt| t tt dS) Nzsqrt(0)rzsqrt(1)rzsqrt(4)rqr9r`) rarbr@rrZr]rerdrfrhrArirMrrrtestSqrtszMathTests.testSqrtcCs|ttj|dtdd|dttjdd|dttj ddz0|ttt|ttt Wn,|t tjt|t tjt Yn0|ttt dS)Nztan(0)rz tan(pi/4)rqrz tan(-pi/4)r`) rarbr@tanrZr[rhrArerfrdrirMrrrtestTanszMathTests.testTancCs|ttj|dtdd|jdtdtddtdd|dttd|dttd|t tt dS) Nztanh(0)rztanh(1)+tanh(-1)rr`rz tanh(inf)z tanh(-inf)) rarbr@tanhrZrrerfrhrArirMrrrtestTanhszMathTests.testTanhcCs8|tdd|tdtdtdddS)Nryr~)r]r@r{rrMrrr testTanhSigns zMathTests.testTanhSigncCsZ|tdd|tdd|ttdt|ttdt|tdd|tdd|tdd|tdd|tdd|td d Gd d d }Gd ddt}Gddd}|t|d|t|d|ttj|ttjdd|ttjtd|ttj|dS)Nrr`rrg?gg !rg-?Yic@seZdZddZdS)z'MathTests.test_trunc..TestTrunccSsdSNrrMrrr __trunc__sz1MathTests.test_trunc..TestTrunc.__trunc__NrOrPrQrrrrr TestTruncsrc@seZdZddZdS)z(MathTests.test_trunc..FloatTrunccSsdSr~rrMrrrrsz2MathTests.test_trunc..FloatTrunc.__trunc__Nrrrrr FloatTruncsrc@s eZdZdS)z)MathTests.test_trunc..TestNoTruncNrSrrrr TestNoTruncsrrr9g7@) r]r@truncrr?r,rarbrF)rKrrrrrr test_truncs&zMathTests.test_trunccCs|td|td|td|td|ttd|ttd|ttddS)Nr=ryr~rrrr)rhr@isfinite assertFalser,rMrrr testIsfiniteszMathTests.testIsfinitecCsx|ttd|ttd|ttdd|ttd|td|tddS)Nrz-nanrr=r~)rhr@rAr,rrMrrr testIsnans zMathTests.testIsnancCs|ttd|ttd|td|td|ttd|td|tddS)Nrrggrr=r~)rhr@rBr,rrMrrr testIsinfszMathTests.testIsinfcCs|ttjdSrG)rhr@rArrMrrrtest_nan_constantszMathTests.test_nan_constantcCsJ|ttj|tjd|tjtd|tj tddS)Nr=rr)rhr@rBrZ assertGreaterr]r,rMrrrtest_inf_constantszMathTests.test_inf_constantzrequires verbose modecCsztd}Wn|dYn0|dkr8|dztd}WntyXYn 0|dztd}WntyYn 0|ddS) Ni6ez6underflowing exp() should not have raised an exceptionrz)underflowing exp() should have returned 0iʚ;z.overflowing exp() didn't trigger OverflowErrorrz sqrt(-1) didn't raise ValueError)r@r6rXrrrdrKrrrrtest_exceptionss     zMathTests.test_exceptionsc Csfdh}d}tjdkrLtd}zttt|d}WntyJYn0d}g}tt D]\}}}} } } } | dks\| dkrq\|dvrq\|dur|dkr||vrq\t t |} d | vsd | vrd } n d | vrd } z | |}Wn,tyd }Ynt yd }Yn0d\}}t | |||}|dur,q\|||||}||q\|rb|dd|dS)NZtan0064darwinr.{}: {}({!r}): {}r=)ZrectZpolar)rr<invaliddivide-by-zerordoverflowrr<r=zFailures in test_testfile:  )rplatformZmac_verr5r;r?r+rdr; test_filegetattrr@rrErrrXjoin)rKZ SKIP_ON_TIGERZ osx_versionZ version_txtrDfailuresr2r3arZaiZereir7funcrr"r#rCmsgrrr test_testfile.sN         zMathTests.test_testfilec Cs(d}g}ttD]\}}}}}tt|}d|vs8d|vr>d}n d|vrJd}z ||} Wn*tyld} Yntyd} Yn0d\} } |dkrd } n>|d krd } n0|d kr|d kr|dkrd} n|dkrd} nd} t|| | | } | durq||||| } || q|r$| dd |dS)Nrrrrdrrrrr2lgammagV瞯<erfcr=r~r$@rrzFailures in test_mtestfile: r) r8math_testcasesrr@rdrrErrrXr)rKrDrr2r3r4r r7rr!r"r#rCrrrrtest_mtestfilegsD       zMathTests.test_mtestfilec Cstj}||gd||gddd||ttddd||tttddd||tddddd||gd d ||gd d ||gd d ||gdd ||gdd||gdtd|t||t|d|t|gd|jt|gddd|jt|ddgddt dt dg}|jt||t dd|t|dgdgdgg|t|ddig|jt|ddigdddid|jt|dgdgdgggd||ddgddd||ddgddgdgd||gddidddi|t|ddgdWdn1sf0Y||gdd||gd d||gd!dd7d"d#}tdd$}|||||td%d&}|||||td'd(}|||dd)d*tdd(D}|||||d+d*td'd&D}|||||d,d*td'd(D}| ||| |dddtd-ddg| |ddtd-ddg| |dtd-ddg| |dtd.td-dg| |dtd/td-dg| |dtd-td.dg| |dtd-td/dg||dddtd.d0d1gtd/||dddtd/d0d1gtd.| |dddtd.d0d1g| |dddtd/d0d1g| |dddtd.d0ddg| |dddtd/d0ddg|t |gd2t |t |gd3t|t |tdd$t |t |tdd$d4dt|t |dt d5dd1dd6gt jdS)8Nrr<)rr9r0iri_7)rr9r{rqr<r)r~rrrrr)rr9r{rr)r~rrrqr<)rrrrr)r~r~rrrr)rrracrbr{abZ abababababab) rr9rr9rr9rr9rr9rr9r2)rrr9r{r)rrr9r{)rr9r{rcSs|D] }||9}q|SrGr)rrelemrrr _naive_prods z(MathTests.test_prod.._naive_prodi'ir`ircSsg|] }t|qSrrZrrrrrrrz'MathTests.test_prod..cSsg|] }t|qSrrZrrrrrrcSsg|] }t|qSrrZrrrrrrrrrrCrq)rr9r{rqr<r)rrr{rqr<rr~rr)r)r@prodr]rDrr7r,rarb bytearrayrrrr?rr)rKrr>rrrrr test_prods    .    $$   zMathTests.test_prodc CsLtj}tj}tdD]8}t|dD]&}|||||||||q$qtddD]F}td|D]6}||||||d|d|||d|qfqXtddD]>}|||dd|||d|||||||qtdD].}||||||||d||q|t|dd|t|dtd|t|dd|t|dd|t|tdd|t|d d|t||t|ddd |t||t |d d|t |d d  d|t |dd |t |dd d  ||dd d||dd d dd d }|||dd|||d||||d ||dt j ddr|t |||dD]2\}}||||d| t|||tq||tdtd d||tdtd dtd D]B}| t|tdt|t| t|tdt|tqdS)Nrrrr2rr~1r10r{r`r9rTZcpython)TT)TF)FFr<)r@permrrr]rarbrrrdrcheck_impl_detailrrGrr?rRrT)rKrrrr)rrrtestPerms\  6     zMathTests.testPermc Cstj}tj}tdD]@}t|dD].}|||||||||||q$qtddD]B}td|D]2}||||||d|d||d|qnq`tdD](}|||dd||||dqtddD],}|||d|||||d|qtdD]6}t|dD]"}||||||||q&q|t|dd|t|dtd|t|dd|t|dd|t|tdd|t|d d|t|d|t|ddd |t||t |d d|t |dd  d|t |dd |t |ddd  ||ddd||ddd ddd }|||dd|||d||||d||dd||||d||||d|||||d||ddt j d dr|t |||ddD]2\}}||||d| t|||tq||tdtdd||tdtddtd D]B}| t|tdt|t| t|tdt|tqdS)Nrrrr9rr~rrrr{r`rTrrr<)r@combrrr]rarbrrrdrrrrGrr?rRrT)rKrrrr)rrrtestCombFsf  2  $ "  zMathTests.testCombcCs|tdt d|tdtd|tddd|tddd|td t td |td ttd |td d d |td dd|tdd d tjj tjj }|tdt||td t||tdt | |td t | |t|dd|t| dd |t|d d|t| d d tjj }|ttd||tt d| |t|tt|t| t t | tt d | td t | tt t dS)Ng0Cg/Cg0CgCr=gCggr~z0x1.fffffffffffffp-1z0x1.0000000000001p+0rry)r]r@ nextafterrer,rassertEqualSignrrminepsilonrrrri)rKZsmallest_subnormalZlargest_normalrrrtest_nextaftersLzMathTests.test_nextafterc Cs |tdtjj|tdd|tdd|tdd|tdtjjtjj|tttttt |tt t | ttj ddddt fD]J}|j |d*|t| t|Wdq1s0YqdS) Nr~llrlg@r=r) r]r@rrrrrrrrerrrrErrrrtest_ulps  zMathTests.test_ulpc CstGddd}tjtjtjfD]P}|}|t|d|Wdn1sR0Y|t|ddqdS)Nc@seZdZddZdS)z$MathTests.test_issue39871..FcSsd|_dddS)NTrr) convertedrMrrrrNsz.MathTests.test_issue39871..F.__float__N)rOrPrQrNrrrrr=sr=z not a numberrF)r@r|rrprarbrr)rKr=rrrrrtest_issue39871s  (zMathTests.test_issue39871cCst|s|d|dS)NzExpected a NaN, got {!r}.)r@rArXrrJrrrrrs zMathTests.assertIsNaNcCs,||||td|td|dS)zSimilar to assertEqual(), but compare also the sign with copysign(). Function useful to compare signed zeros. r~N)r]r@r)rKrrrrrrs zMathTests.assertEqualSignN)r<r=)LrOrPrQrZr_rjrlrnrprsrwr}rrrrunittestZskipIfrrmachinerrrrrrrZ cpython_onlyrrrrHAVE_DOUBLE_ROUNDINGrrr"r?rJrMrQrSrVrYZrequires_mac_verr[r^rcrfrirtrurwrxrzr|r}rrrrrrZ skipUnlessrrrrrrrrrrrrrrrrrrWs       =! !     ^*Jq5,                  8 B\@F - rWc@seZdZejZddZddZddZddZd d Z d d Z d dZ ddZ ddZ ddZddZddZddZddZddZdS) IsCloseTestscOs0|j|j||g|Ri|d||fddS)Nz%s and %s should be close!r)rhiscloserKrrrkwargsrrr assertIsCloses zIsCloseTests.assertIsClosecOs0|j|j||g|Ri|d||fddS)Nz%s and %s should not be close!r)rrrrrrassertIsNotCloses zIsCloseTests.assertIsNotClosecOs,|D]"\}}|j||g|Ri|qdSrG)rrKZexamplesrrrrrrrassertAllCloses zIsCloseTests.assertAllClosecOs,|D]"\}}|j||g|Ri|qdSrG)rrrrrassertAllNotCloses zIsCloseTests.assertAllNotClosecCsz|t |jddddWdn1s00Y|t"|jdddddWdn1sl0YdS)Nrg0.+rel_tolrg _©rr#)rardrrMrrrtest_negative_tolerancess . z%IsCloseTests.test_negative_tolerancescCsgd}|j|ddddS)N))rr)N@ir);r)i90g@)r=ry)NFrr=rr)rKZidentical_examplesrrrtest_identical szIsCloseTests.test_identicalcCs(gd}|j|dd|j|dddS)N))gחAgחA)g:0yEgnyE)g ѭ?gfNӭ?:0yE>r& .>rr)rKZeight_decimal_places_examplesrrrtest_eight_decimal_placessz&IsCloseTests.test_eight_decimal_placescCs(gd}|j|dd|j|dddS)N))rr=)g& .r=)gu?j/ʠr=rdrrr)rr)rKZnear_zero_examplesrrrtest_near_zeroszIsCloseTests.test_near_zerocCs<|tt|jttdd|tt|jttdddS)Nr=r)rrerfrMrrrtest_identical_infinite&s  z$IsCloseTests.test_identical_infinitec CsRttftdfdtfttfttfttftdfdtftdfdtfg }|j|dddS)Nrr~gg?r)rirerfr)rKZnot_close_examplesrrrtest_inf_ninf_nan-s zIsCloseTests.test_inf_ninf_nancCs0gd}|j|ddgd}|j|dddS)N))r~r~)333333 r)Ynrr=r))r~g?)g?r~)gZbtigTbtir)rKZzero_tolerance_close_examplesZ!zero_tolerance_not_close_examplesrrrtest_zero_tolerance<sz IsCloseTests.test_zero_tolerancecCs|jddgdddS)N)r#r)rr#r\rrrMrrrtest_asymmetryHszIsCloseTests.test_asymmetrycCs(ddg}|j|dd|j|dddS)N))i[i[rrrr)rKZinteger_examplesrrr test_integersLs zIsCloseTests.test_integerscCshddlm}|d|df|d|df|d|df|d |d fg}|j|d d |j|d d dS)Nrrz 1.00000001z1.0z1.00000001e-20z1.0e-20z1.00000001e-100z1.0e-100z 1.00000001e20z1.0e20rrr)rrrr)rKrZdecimal_examplesrrr test_decimalsTs zIsCloseTests.test_decimalscCsdddlm}|ddd|df|d|df|dd|ddfg}|j|dd |j|d d dS) Nrr rrrl (qe rOrrr)rr rr)rKr Zfraction_examplesrrrtest_fractions_s zIsCloseTests.test_fractionsN)rOrPrQr@rrrrrrrrrrrrrrrrrrrrrs     rcCsNddlm}t}|tt|tt||dt|dS)Nr) DocFileSuitez ieee754.txt) doctestrrZ TestSuiteZaddTestZ makeSuiterWrr)rZsuiterrr test_mainks  r)r<r=)8Z test.supportrrrtestrrr8rr@osrrr rrgr,rirerfrrrrrrrrrOargvfile__file__pathdirnamecurdirZtest_dirrrrrrrrr%r8r;rErFr?rRrIrTZTestCaserWrrrrrrsl   &  -{