B
    F0d?*                 @   sZ   d Z dgZddlmZ ddlmZ ddlmZ edG dd dZe	dkrVe
e  d	S )
z
Machine arithmetics - determine the parameters of the
floating-point arithmetic system

Author: Pearu Peterson, September 2003

MachAr    )any)errstate)
set_modulenumpyc               @   s8   e Zd ZdZeeedd dfddZdd Zd	d
 ZdS )r   a  
    Diagnosing machine parameters.

    Attributes
    ----------
    ibeta : int
        Radix in which numbers are represented.
    it : int
        Number of base-`ibeta` digits in the floating point mantissa M.
    machep : int
        Exponent of the smallest (most negative) power of `ibeta` that,
        added to 1.0, gives something different from 1.0
    eps : float
        Floating-point number ``beta**machep`` (floating point precision)
    negep : int
        Exponent of the smallest power of `ibeta` that, subtracted
        from 1.0, gives something different from 1.0.
    epsneg : float
        Floating-point number ``beta**negep``.
    iexp : int
        Number of bits in the exponent (including its sign and bias).
    minexp : int
        Smallest (most negative) power of `ibeta` consistent with there
        being no leading zeros in the mantissa.
    xmin : float
        Floating-point number ``beta**minexp`` (the smallest [in
        magnitude] positive floating point number with full precision).
    maxexp : int
        Smallest (positive) power of `ibeta` that causes overflow.
    xmax : float
        ``(1-epsneg) * beta**maxexp`` (the largest [in magnitude]
        usable floating value).
    irnd : int
        In ``range(6)``, information on what kind of rounding is done
        in addition, and on how underflow is handled.
    ngrd : int
        Number of 'guard digits' used when truncating the product
        of two mantissas to fit the representation.
    epsilon : float
        Same as `eps`.
    tiny : float
        Same as `xmin`.
    huge : float
        Same as `xmax`.
    precision : float
        ``- int(-log10(eps))``
    resolution : float
        ``- 10**(-precision)``

    Parameters
    ----------
    float_conv : function, optional
        Function that converts an integer or integer array to a float
        or float array. Default is `float`.
    int_conv : function, optional
        Function that converts a float or float array to an integer or
        integer array. Default is `int`.
    float_to_float : function, optional
        Function that converts a float array to float. Default is `float`.
        Note that this does not seem to do anything useful in the current
        implementation.
    float_to_str : function, optional
        Function that converts a single float to a string. Default is
        ``lambda v:'%24.16e' %v``.
    title : str, optional
        Title that is printed in the string representation of `MachAr`.

    See Also
    --------
    finfo : Machine limits for floating point types.
    iinfo : Machine limits for integer types.

    References
    ----------
    .. [1] Press, Teukolsky, Vetterling and Flannery,
           "Numerical Recipes in C++," 2nd ed,
           Cambridge University Press, 2002, p. 31.

    c             C   s   d|  S )Nz%24.16e )vr   r   C/var/www/html/venv/lib/python3.7/site-packages/numpy/core/machar.py<lambda>d       zMachAr.<lambda>zPython floating point numberc          	   C   s,   t dd | ||||| W dQ R X dS )a!  

        float_conv - convert integer to float (array)
        int_conv   - convert float (array) to integer
        float_to_float - convert float array to float
        float_to_str - convert array float to str
        title        - description of used floating point numbers

        ignore)ZunderN)r   _do_init)self
float_convint_convfloat_to_floatfloat_to_strtitler   r   r	   __init__b   s    zMachAr.__init__c       .      C   s  d}d}|d}|| }	|| }
|}xLt |D ].}|| }|| }|| }t|| |
kr.P q.W t|||jf |}xLt |D ].}|| }|| }||| }t|dkrP qW t|||jf |}||}d}|}xTt |D ]6}|d }|| }|| }|| }t|| |
krP qW t|||jf ||	 }|}xPt |D ]2}|| }|| }|| }t|| |
krDP qDW t|||jf || }d}t|| |
krd}|| }|| }|dkrt|| |
krd}|d }|| }|}xt |D ]}|| }qW |}xht |D ]J}|| }t|| |
kr<P || }|d }|dk rtdt  qW t|||jf | }|}| d }|}xPt |D ]2}|| }t|| |
krP || }|d }qW t|||jf |}d}|| }|dkrt|| | |
krd}d}d}|}|| } d}!xt |D ]t}|}"|"|" }|| }||  }t|| |
kstt||"krP || }t|| |krP |d }|| }q<W t|||jf |d	kr|d }#|| }$n6d}#|}%x ||%kr
|%| }%|#d }#qW |%|% d }$xt |D ]}|"}&|"| }"|"| }|"|  }t|| |
krtt|"|&k r|d }|| }t|| |"krt||"krd}!|"}&P nP q"W t|||jf | }'|$|| d kr|d	kr|$|$ }$|#d }#|$|' }(||! }|dkr|(d }(|(|' }|dkr0|s0|(d }(|d
krB|(d }(t||"krX|(d }(|| })t|)| |)kr~|||  })|)|&| | |  })|(|' d }x.t |D ]"}*|dkr|)|) })n|)| })qW || _|| _|| _||| _	||| _
|| _||| _||| _|| _|#| _|'| _||&| _||&| _|(| _||)| _||)| _|| _|| _| j| _| j| _| j| _dd l}+t|+|| j | _|	|	 |	 |	 |	 },|,| j  }-||-| _||-| _ d S )Ni'  z'Did not converge after %d tries with %s   r         zAcould not determine machine tolerance for 'negep', locals() -> %s
      )!ranger   RuntimeErrorZdtypelocalsabsibetaitnegepepsnegZ_str_epsnegmachepepsZ_str_epsngrdiexpminexpxminZ	_str_xminmaxexpxmaxZ	_str_xmaxirndr   epsilonZtinyZhugemathintlog10	precision
resolutionZ_str_resolution).r   r   r   r   r   r   Z	max_iterNmsgonetwozeroa_tempZtemp1bZitempr   betar    Zbetahr+   Ztempar!   Zbetainir"   r#   r$   r%   kztZnxresyr&   ZmxZizr(   r'   r)   r*   jr-   tenr1   r   r   r	   r   t   s\   

 $

$ 












zMachAr._do_initc             C   s   d}|| j  S )Na  Machine parameters for %(title)s
---------------------------------------------------------------------
ibeta=%(ibeta)s it=%(it)s iexp=%(iexp)s ngrd=%(ngrd)s irnd=%(irnd)s
machep=%(machep)s     eps=%(_str_eps)s (beta**machep == epsilon)
negep =%(negep)s  epsneg=%(_str_epsneg)s (beta**epsneg)
minexp=%(minexp)s   xmin=%(_str_xmin)s (beta**minexp == tiny)
maxexp=%(maxexp)s    xmax=%(_str_xmax)s ((1-epsneg)*beta**maxexp == huge)
---------------------------------------------------------------------
)__dict__)r   fmtr   r   r	   __str__G  s    	zMachAr.__str__N)	__name__
__module____qualname____doc__floatr.   r   r   rD   r   r   r   r	   r      s   P T__main__N)rH   __all__Znumpy.core.fromnumericr   Znumpy.core._ufunc_configr   Znumpy.core.overridesr   r   rE   printr   r   r   r	   <module>   s     G