B
    <Z                 @   sh   d dl mZ ddlZddlZd dlmZ d dlmZ d dlmZm	Z	m
Z
 d dlmZ G dd	 d	eZdS )
   )StandardBaseContext    N)math2)function_docs)mpf_bernoullito_float	int_types)libmpc               @   s  e Zd ZdZdd Zdd ZejZdd Zdd	 Z	d
d Z
dd ZdZeee	Zee
eZdZdZejZejZejZejZdZedd Zdd ZejZej Z ej!Z!dZ"dZ#dZ$dZ%dZ&dZ!dZ'dZ(dZ)dZ*e+ Z,Z-d d! Z.d"d# Z/d$d% Z0d&d' Z1d(d) Z2e3Z4e5Z6d*d+ Z7e8ej9Z:e8ej;Z;e8ej<Z<e8ej= Z>Z=e8ej?Z?e8ej@Z@e8ejAZAe8ejBZBe8ejCZCe8ejDZDe8ejEZEe8ejFZFe8ejGZGe8ejHZHe8ejIZIe8ejJZJe8ejK ZLZKe8ejMZMe8ejNZNe8ejOZOe8ejPZPe8ejQZQe8ejRZSe8ejTZUe8ejVZWe8ejX ZYZZd,d- Z[d.d/ Z\d0d1 Z]e^j_Z_e^j`Z`d2d3 Zad4d5 Zbd6d7 Zcd8d9 Zdd:d; Zed<d= ZfdOd?d@ZgdAdB ZhdCdD Zie8ejjZjdEdF ZkelZmdGdH ZndIdJ Zoe8ejpZqe8ejrZsdPdLdMZtdNS )Q	FPContextz
    Context for fast low-precision arithmetic (53-bit precision, giving at most
    about 15-digit accuracy), using Python's builtin float and complex.
    c             C   s*   t |  tj| _i | _d| _|   d S )NF)r   __init__r   Zloggamma_bernoulli_cacheZprettyZ_init_aliases)ctx r   ,lib/python3.7/site-packages/mpmath/ctx_fp.pyr      s
    
zFPContext.__init__c             C   s   t |d |d  S )Nr   r   )float)clsxr   r   r   <lambda>   s    zFPContext.<lambda>c             C   s   dS )N5   r   )r   r   r   r   	_get_prec    s    zFPContext._get_precc             C   s   d S )Nr   )r   pr   r   r   	_set_prec!   s    zFPContext._set_precc             C   s   dS )N   r   )r   r   r   r   _get_dps"   s    zFPContext._get_dpsc             C   s   d S )Nr   )r   r   r   r   r   _set_dps#   s    zFPContext._set_dpsTg        g      ?y              ?c                s8   |r fdd}n }t j| j|_t| || d S )Nc                s(   | j   fdd|D }| f||S )Nc                s   g | ]} |qS r   r   ).0a)convertr   r   
<listcomp>8   s    z>FPContext._wrap_specfun.<locals>.f_wrapped.<locals>.<listcomp>)r   )r   argskwargs)f)r   r   	f_wrapped6   s    z*FPContext._wrap_specfun.<locals>.f_wrapped)r   __dict__get__doc__setattr)r   namer!   Zwrapr"   r   )r!   r   _wrap_specfun3   s
    zFPContext._wrap_specfunc             C   s6   | j }||kr|| S tt|dddd||< || S )Nr   nT)strict)r   r   r   )r   r)   cacher   r   r   	bernoulli?   s
    zFPContext.bernoullig;f?gw@gw?g9B.?gUk@gox?g]O?gm<B{@g!;?gs/O҄?c             C   s   || dkS )Ng        r   )r   r   r   r   r   
is_specialV   s    zFPContext.is_specialc             C   s   ||kS )Nr   )r   r   r   r   r   isnanY   s    zFPContext.isnanc             C   s   t |tjkS )N)absr   INF)r   r   r   r   r   isinf\   s    zFPContext.isinfc             C   s   |r|| dkS dS )Ng        Fr   )r   r   r   r   r   isnormal_   s    zFPContext.isnormalc             C   s0   t |tkr|jrdS |j}|dko.t||kS )NFg        )typecompleximagrealround)r   r   r   r   r   isnpintd   s
    zFPContext.isnpintc             C   s   yt |S    t|S d S )N)r   r4   )r   r   r   r   r   r   n   s    zFPContext.convertc             C   s   t |}t|j|jS )N)r4   mathatan2r5   r6   )r   zr   r   r   arg   s    zFPContext.argc             C   s   |  | j| S )N)expj)r   r   r   r   r   expj   s    zFPContext.expjc             C   s   |  | j| j | S )N)r=   r>   pi)r   r   r   r   r   expjpi   s    zFPContext.expjpic             C   s   |r|  t|d S | jS )Nr   )frexpr/   ninf)r   r;   r   r   r   mag   s    zFPContext.magc             C   s6   t |dr|jrdS |j}y|t|kS    dS d S )Nr5   F)hasattrr5   r6   int)r   r;   r   r   r   isint   s    
zFPContext.isintc             C   sF   t |drt|j}nt|}||kr0|| jfS || t|| fS )Nr5   )rE   r7   r6   rC   rD   r/   )r   r;   r)   r   r   r   nint_distance   s    

zFPContext.nint_distancec             C   s\   t |tkr&|\}}| || dfS t|dr<t|j}nt|}||krT|dfS |dfS )NRr5   Z)r3   tuplempfrE   rF   r6   )r   r;   r   qZintzr   r   r   _convert_param   s    
zFPContext._convert_paramc             C   s   t |tpt |tS )N)
isinstancer   r   )r   r;   r   r   r   _is_real_type   s    zFPContext._is_real_typec             C   s
   t |tS )N)rO   r4   )r   r;   r   r   r   _is_complex_type   s    zFPContext._is_complex_typep  c             K   s   t |}t|}t||| }	| j}
d }}d}x~x|D ]}||| | 9 }q8W x|	D ]}||| |  }qVW |d7 }|| }||9 }||7 }t||
k r|S ||kr2| jq2W d S )Ng      ?r   r   )listrangeepsr/   NoConvergence)r   r   rM   typesZcoeffsr;   Zmaxtermsr    ZnumZdenZtolstkir   r   r   hypsum   s&    
 
    zFPContext.hypsumc             C   s   t ||S )N)r9   r:   )r   r   yr   r   r   r:      s    zFPContext.atan2c             C   s@   t |}|dkr| |S d|d  | | | |d | S )Nr   r   )rF   digammafaczeta)r   mr;   r   r   r   psi   s    
zFPContext.psic             C   s2   |  |}|dks|dkr|S | |d | j S )Nr   r   )r   r_   euler)r   r   r   r   r   harmonic   s    
zFPContext.harmonicc             C   s   t t||S )N)rF   r9   ldexp)r   r   precr   r   r   to_fixed   s    zFPContext.to_fixedc             C   s   dd l }|  S )Nr   )random)r   ri   r   r   r   rand   s    zFPContext.randr   c             C   sP   | j }d}x@| D ]6}||7 }|| s@|r@t|dt| kr@P |d7 }qW |S )Nr   gC]r2<r   )zeror/   )r   ZtermsZ
check_steprX   rZ   Ztermr   r   r   sum_accurately   s    zFPContext.sum_accuratelyN)rR   )r   )u__name__
__module____qualname__r%   r   Z_mpqr	   rV   r   r   r   r   Z_fixed_precisionpropertyrg   Zdpsrk   Zoner   ZEPSrU   r0   infZNINFrC   ZNANnanr>   classmethodr(   r,   r@   erd   Zsqrt2Zsqrt5ZphiZln2Zln10ZcatalanZkhinchinZaperyZglaisherr/   ZabsminZabsmaxr-   r.   r1   r2   r8   r   rL   r4   Zmpcr   staticmethodpowZpowerZsqrtr=   logZlnZcosZsinZtanZcos_sinZacosZasinZatanZcoshZsinhZtanhZgammaZrgammaZ	factorialr`   ZfloorZceilZcospiZsinpiZcbrtZnthrootZ_nthrootZeiZ_eiZe1Z_e1ra   Z_zetaZ	_zeta_intr<   r?   rA   r9   rf   rB   rD   rG   rH   rN   rP   rQ   r\   r:   rc   r_   re   strZnstrrh   rj   ZerfZ_erfZerfcZ_erfcrl   r   r   r   r   r
      s   


























	



r
   )Zctx_baser   r9   Zcmath r   r   r	   r   r   r   r
   r   r   r   r   <module>   s   