o
    ¨"`k  ã                   @   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J ‚tdƒd dksJ ‚tdƒd d	ks!J ‚tdƒd
 dks+J ‚tdƒd  d¡s6J ‚tdƒd  d¡sAJ ‚tdƒd  d¡sLJ ‚tdƒd
  d¡sWJ ‚tdƒd  d¡sbJ ‚tdƒd  d¡smJ ‚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ÚmpfZae© r   r   ú9/usr/lib/python3/dist-packages/mpmath/tests/test_power.pyÚtest_fractional_pow   s   r   c                  C   s–   t  d¡ dD ]A} tdƒD ]:}t  d| d > d| > ¡}t  dd¡}|| }ttt|ƒt|ƒ| tƒƒ|k s6J ‚ttt|ƒt|ƒ| tƒƒ|ksGJ ‚qq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_downÚround_up)ÚprecÚiÚaÚbÚabr   r   r   Útest_pow_integer_direction   s   
"$úÿr   c                  C   sÖ  dd„ } dD ]Þ\}}|t _tdƒtdƒ| d   }tdƒtdƒ| d   }| }| }|t _t}| |d|ƒdks=J ‚| |d|ƒdksGJ ‚| |d|ƒdk sQJ ‚| |d|ƒdks[J ‚| |d|ƒdkseJ ‚| |d|ƒdksoJ ‚| |d|ƒdksyJ ‚| |d|ƒdksƒJ ‚| |d	|ƒdksJ ‚| |d	|ƒdks—J ‚| |d	|ƒdks¡J ‚| |d	|ƒdk s«J ‚| |d
|ƒdksµJ ‚| |d
|ƒdks¿J ‚| |d
|ƒdksÉJ ‚| |d
|ƒdksÓJ ‚t}| |d|ƒdksßJ ‚| |d|ƒdk séJ ‚| |d|ƒdksóJ ‚| |d|ƒdksýJ ‚| |d|ƒdksJ ‚| |d|ƒdk sJ ‚| |d|ƒdksJ ‚| |d|ƒdk s)J ‚| |d	|ƒdk s4J ‚| |d	|ƒdks?J ‚| |d	|ƒdksJJ ‚| |d	|ƒdksUJ ‚| |d
|ƒdk s`J ‚| |d
|ƒdkskJ ‚| |d
|ƒdk svJ ‚| |d
|ƒdksJ ‚t}| |d|ƒdksŽJ ‚| |d|ƒdks™J ‚| |d|ƒdks¤J ‚| |d|ƒdks¯J ‚| |d|ƒdksºJ ‚| |d|ƒdksÅJ ‚| |d|ƒdksÐJ ‚| |d|ƒdksÛJ ‚| |d	|ƒdksæJ ‚| |d	|ƒdksñJ ‚| |d	|ƒdksüJ ‚| |d	|ƒdksJ ‚| |d
|ƒdksJ ‚| |d
|ƒdksJ ‚| |d
|ƒdks(J ‚| |d
|ƒdks3J ‚t}| |d|ƒdks@J ‚| |d|ƒdk sKJ ‚| |d|ƒdk sVJ ‚| |d|ƒdksaJ ‚| |d|ƒdkslJ ‚| |d|ƒdk swJ ‚| |d|ƒdks‚J ‚| |d|ƒdk sJ ‚| |d	|ƒdk s˜J ‚| |d	|ƒdks£J ‚| |d	|ƒdks®J ‚| |d	|ƒdk s¹J ‚| |d
|ƒdk sÄJ ‚| |d
|ƒdksÏJ ‚| |d
|ƒdk sÚJ ‚| |d
|ƒdksåJ ‚q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   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    