B
    <Zk  ã               @   s4   d dl T d dlT d dlZdd„ Zdd„ Zdd„ ZdS )	é    )Ú*Nc               C   sÞ   dt _tdƒd dkst‚tdƒd dks.t‚tdƒd d	ksBt‚tdƒd
 dksVt‚tdƒd  d¡slt‚tdƒd  d¡s‚t‚tdƒd  d¡s˜t‚tdƒd
  d¡s®t‚tdƒd  d¡sÄt‚tdƒd  d¡sÚt‚d S )Né   é   g      @i   é@   g      à?é   g      à¿g      À?g      Àg      P?é
   gR[Ú:XL	@gX—úí¤Ãs@gIHb=Ô?g·3äÆçi?g333333Ó?g¯¸[-˜ìÿ?g333333Ó¿gRB3Ï¹	à?)ÚmpÚdpsÚmpfÚAssertionErrorZae© r   r   ú6lib/python3.7/site-packages/mpmath/tests/test_power.pyÚtest_fractional_pow   s    r   c              C   sž   t  d¡ xŽdD ]†} x€tdƒD ]t}t  d| d > d| > ¡}t  dd¡}|| }ttt|ƒt|ƒ| tƒƒ|k spt‚ttt|ƒt|ƒ| t	ƒƒ|kst‚qW qW dS )zR
    Test that inexact integer powers are rounded in the right
    direction.
    iÒ  )r   é5   éÈ   é2   é   é   éd   N)
ÚrandomZseedÚrangeZrandintZto_intZmpf_powZfrom_intÚ
round_downr   Úround_up)ÚprecÚiÚaÚbZabr   r   r   Útest_pow_integer_direction   s    

"r   c              C   sô  dd„ } xÞdD ]Ô\}}|t _tdƒtdƒ| d   }tdƒtdƒ| d   }| }| }|t _t}| |d|ƒdks~t‚| |d|ƒdks’t‚| |d|ƒdk s¦t‚| |d|ƒdksºt‚| |d|ƒdksÎt‚| |d|ƒdksât‚| |d|ƒdksöt‚| |d|ƒdkst‚| |d	|ƒdks"t‚| |d	|ƒdks8t‚| |d	|ƒdksNt‚| |d	|ƒdk sdt‚| |d
|ƒdkszt‚| |d
|ƒdkst‚| |d
|ƒdks¦t‚| |d
|ƒdks¼t‚t}| |d|ƒdksÖt‚| |d|ƒdk sìt‚| |d|ƒdkst‚| |d|ƒdkst‚| |d|ƒdks.t‚| |d|ƒdk sDt‚| |d|ƒdksZt‚| |d|ƒdk spt‚| |d	|ƒdk s†t‚| |d	|ƒdksœt‚| |d	|ƒdks²t‚| |d	|ƒdksÈt‚| |d
|ƒdk sÞt‚| |d
|ƒdksôt‚| |d
|ƒdk s
t‚| |d
|ƒdks t‚t}| |d|ƒdks:t‚| |d|ƒdksPt‚| |d|ƒdksft‚| |d|ƒdks|t‚| |d|ƒdks’t‚| |d|ƒdks¨t‚| |d|ƒdks¾t‚| |d|ƒdksÔt‚| |d	|ƒdksêt‚| |d	|ƒdks t‚| |d	|ƒdkst‚| |d	|ƒdks,t‚| |d
|ƒdksBt‚| |d
|ƒdksXt‚| |d
|ƒdksnt‚| |d
|ƒdks„t‚t}| |d|ƒdksžt‚| |d|ƒdk s´t‚| |d|ƒdk sÊt‚| |d|ƒdksàt‚| |d|ƒdksöt‚| |d|ƒdk st‚| |d|ƒdks"t‚| |d|ƒdk s8t‚| |d	|ƒdk sNt‚| |d	|ƒdksdt‚| |d	|ƒdkszt‚| |d	|ƒdk st‚| |d
|ƒdk s¦t‚| |d
|ƒdks¼t‚| |d
|ƒdk sÒt‚| |d
|ƒdkst‚qW dt _dS )aµ  
    Stress test directed rounding for powers with integer exponents.
    Basically, we look at the following cases:

    >>> 1.0001 ** -5 # doctest: +SKIP
    0.99950014996500702
    >>> 0.9999 ** -5 # doctest: +SKIP
    1.000500150035007
    >>> (-1.0001) ** -5 # doctest: +SKIP
    -0.99950014996500702
    >>> (-0.9999) ** -5 # doctest: +SKIP
    -1.000500150035007

    >>> 1.0001 ** -6 # doctest: +SKIP
    0.99940020994401269
    >>> 0.9999 ** -6 # doctest: +SKIP
    1.0006002100560125
    >>> (-1.0001) ** -6 # doctest: +SKIP
    0.99940020994401269
    >>> (-0.9999) ** -6 # doctest: +SKIP
    1.0006002100560125

    etc.

    We run the tests with values a very small epsilon away from 1:
    small enough that the result is indistinguishable from 1 when
    rounded to nearest at the output precision. We check that the
    result is not erroneously rounded to 1 in cases where the
    rounding should be done strictly away from 1.
    c             S   s   t t| j|tj|ƒƒS )N)Zmake_mpfZmpf_pow_intZ_mpf_r   r   )ÚxÚnÚrr   r   r   ÚpowrC   s    z'test_pow_epsilon_rounding.<locals>.powr))r   é   )iˆ  i¸  r   r   é   éÿÿÿÿé   éûÿÿÿiúÿÿÿr   N)	r   r   r
   r   r   r   Zround_ceilingZround_floorr	   )r!   ZinprecZoutprecZpos10001Zpos09999Zneg10001Zneg09999r    r   r   r   Útest_pow_epsilon_rounding#   sš     r'   )ZmpmathZmpmath.libmpr   r   r   r'   r   r   r   r   Ú<module>   s
   