
    ,Vh.-                     l    d Z dgZddlmZ ddlmZ ddlmZ  G d d      Ze	dk(  r e
 e              y	y	)
z
Machine arithmetic - determine the parameters of the
floating-point arithmetic system

Author: Pearu Peterson, September 2003

MachAr   )any)errstate   )
set_modulec                   0    e Zd ZdZeeed dfdZd Zd Zy)r   aw  
    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
        An alias for `smallest_normal`, kept for backwards compatibility.
    huge : float
        Same as `xmax`.
    precision : float
        ``- int(-log10(eps))``
    resolution : float
        ``- 10**(-precision)``
    smallest_normal : float
        The smallest positive floating point number with 1 as leading bit in
        the mantissa following IEEE-754. Same as `xmin`.
    smallest_subnormal : float
        The smallest positive floating point number with 0 as leading bit in
        the mantissa following IEEE-754.

    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                     d| z  S )Nz%24.16e )vs    C/home/dcms/DCMS/lib/python3.12/site-packages/numpy/_core/_machar.py<lambda>zMachAr.<lambda>j   s
    y1}     zPython floating point numberc                 p    t        d      5  | j                  |||||       ddd       y# 1 sw Y   yxY w)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)underN)r   _do_init)self
float_convint_convfloat_to_floatfloat_to_strtitles         r   __init__zMachAr.__init__h   s9     H% 	UMM*heT	U 	U 	Us   ,5c                    d}d} |d      }||z   }	||z
  }
|}t        |      D ]$  }||z   }||z   }||z
  }t        ||z
  |
k7        s$ n t        ||j                  fz        |}t        |      D ]'  }||z   }||z   } |||z
        }t        |dk7        s' n t        |||j                  fz        |} ||      }d}|}t        |      D ])  }|dz   }||z  }||z   }||z
  }t        ||z
  |
k7        s) n t        |||j                  fz        ||	z  }|}t        |      D ]$  }||z   }||z   }||z
  }t        ||z
  |
k7        s$ n t        |||j                  fz        ||z   }d}t        ||z
  |
k7        rd}||z   }||z   }|dk(  rt        ||z
  |
k7        rd}|dz   }||z  }|}t        |      D ]  }||z  }	 |}t        |      D ]?  }||z
  }t        ||z
  |
k7        r nA||z  }|dz
  }|dk  s+t        dt	               z         t        |||j                  fz        | }|}| dz
  }|}t        |      D ]$  }||z   }t        ||z
  |
k7        r n&||z  }|dz   }& t        |||j                  fz        |}d}||z   }|dk(  rt        ||z  |z
  |
k7        rd}d}d}|}||z   } d}!t        |      D ]_  }|}"|"|"z  }||z  }|| z  }t        ||z   |
k(        st        t        |      |"k\        r n>||z  }t        ||z  |k(        r n&|dz   }||z   }a t        |||j                  fz        |d	k7  r|dz   }#||z   }$n!d}#|}%||%k\  r|%|z  }%|#dz   }#||%k\  r|%|%z   dz
  }$t        |      D ]m  }|"}&|"|z  }"|"|z  }|"| z  }t        ||z   |
k7        rHt        t        |"      |&k        r1|dz   }||z  }t        ||z  |"k(        sXt        ||"k7        sgd}!|"}& n n t        |||j                  fz        | }'|$||z   dz
  k  r|d	k7  r
|$|$z   }$|#dz   }#|$|'z   }(||!z   }|dk\  r|(dz
  }(|(|'z   }|dk(  r|s|(dz
  }(|d
kD  r|(dz
  }(t        ||"k7        r|(dz
  }(||z
  })t        |)|z  |)k7        r|||z  z
  })|)|&|z  |z  |z  z  })|(|'z   dz   }t        |      D ]  }*|dk(  r|)|)z   })|)|z  }) t        |&||z  z        }+|| _        || _        || _         ||      | _	         ||      | _
        || _         ||      | _         ||      | _        || _        |#| _        |'| _         ||&      | _         ||&      | _        |(| _         ||)      | _         ||)      | _        || _        || _        | j                  | _        | j"                  | _        | j(                  | _        | j"                  | _         || j"                        | _         ||+      | _         ||+      | _        dd l},tA        |,jC                   || j                                     | _"        |	|	z   |	z   |	z   |	z   }-|-| jD                   z  }. ||.      | _#         ||.      | _$        y )Ni'  z'Did not converge after %d tries with %sr       r      zAcould not determine machine tolerance for 'negep', locals() -> %s
      )%ranger   RuntimeErrordtypelocalsabsibetaitnegepepsneg_str_epsnegmachepeps_str_epsngrdiexpminexpxmin	_str_xminmaxexpxmax	_str_xmaxirndr   epsilontinyhugesmallest_normal_str_smallest_normalsmallest_subnormal_str_smallest_subnormalmathintlog10	precision
resolution_str_resolution)/r   r   r   r   r   r   	max_iterNmsgonetwozeroa_temptemp1bitempr%   betar&   betahr5   tempar'   betainir(   r*   r+   r-   kztnxresyr.   mxizr0   r/   r2   r3   jr;   r=   tenrA   s/                                                  r   r   zMachAr._do_initz   s   	7mCiSy y! 	5AAAs7D1HE53;$&'	5 sa^344y! 	5AAAq5DT!V$E5A:	5 sa^344%  y! 	5AaBDAs7D1HE53;$&'	5 sa^344s
y! 	5AAAs7D1HE53;$&'	5 sa^3445ytAv~DDu}19T%Z4/0D Qtu 	AF
A	y! 	5A7D48t#$DAAIEqy" $ADJH$N O O	5 sa^344 y! 	5A7D48t#$DAaZF	5 sa^344 Sy19T#X^t34D #Iy! 	5AA!A#AQ3D1Q3$;3s1v{#36ME5:?#AAAA	5 sa^344B;q5DQBDBr'%Zax r' b1B y! 	5ADF
ACAq5DAEd?#CFTM(:EvuTzQ'C	NED	5 sa^344 Q?u{bB!8Dfe|19aZFVOA:aaZFr6aZFqAv;aZFV|tCx4 f$DtDy~d*+VOaq 	#Azd{d{		# !!45

$V,'/!#&$S)		"4(	%d+"4(	%d+	
xxII	II	#yy$0$;!"01C"D'34F'G$djj)ABBCCi#o#c)dnn_-
(4+J7r   c                 $    d}|| j                   z  S )NaC  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)
smallest_normal=%(smallest_normal)s    smallest_subnormal=%(smallest_subnormal)s
---------------------------------------------------------------------
)__dict__)r   fmts     r   __str__zMachAr.__str__S  s    	U 	 T]]""r   N)	__name__
__module____qualname____doc__floatr>   r   r   r_   r
   r   r   r   r      s+    Tl #( %45U$W8r#r   __main__N)rc   __all__fromnumericr   _ufunc_configr   _utilsr   r   r`   printr
   r   r   <module>rk      sA    *  # 
O# O#d
 z	&(O r   