a :jg.-@sRdZdgZddlmZddlmZddlmZGdddZe dkrNe ed S) z Machine arithmetic - determine the parameters of the floating-point arithmetic system Author: Pearu Peterson, September 2003 MachAr)any)errstate) set_modulec@s8eZdZdZeeedddfddZddZd d Zd S) raw 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. cCsd|S)Nz%24.16e)vrr=/usr/local/lib/python3.9/site-packages/numpy/_core/_machar.pyjzMachAr.zPython floating point numbercCs@tdd"||||||Wdn1s20YdS)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)ZunderN)r_do_init)self float_convint_convfloat_to_float float_to_strtitlerrr __init__hs zMachAr.__init__c/Csd}d}|d}||} ||} |} t|D]0} | | } | |} | | }t||| kr,qpq,t|| |jf|}t|D]0} ||}| |} || | }t|dkr|qq|t|| |jf|}||}d}|}t|D]:} |d}||}||} | |}t||| krq*qt|| |jf|| }|} t|D]6} | | } | |} | | }t||| kr>qq>t|| |jf| |} d}t| | | krd}| |}||} |dkrt| || krd}|d}||}|} t|D]}| |} q| }t|D]N} || } t| || kr6qt| |} |d}|dkrtdtqt|| |jf| }| }| d}|} t|D]6} || } t| || krq| |} |d}qt|| |jf| }d}||} |dkrt| ||| krd}d}d}|}||} d}!t|D]|} |}"|"|"}||} || } t| | | ksvtt||"kr|q| |}t|||krq|d}||}q2t|| |jf|d kr|d}#||}$n2d}#|}%||%kr|%|}%|#d}#q|%|%d}$t|D]} |"}&|"|}"|"|} |"| } t| | | krtt|"|&kr|d}| |}t|||"krt| |"krd}!|"}&qnqqt|| |jf| }'|$||dkr|d kr|$|$}$|#d}#|$|'}(||!}|dkr |(d}(|(|'}|dkr,|s,|(d}(|d kr>|(d}(t| |"krT|(d}(||})t|)||)krz|||})|)|&|||})|(|'d}t|D]"}*|dkr|)|)})n|)|})qt|&||}+||_||_||_|||_ |||_ ||_ |||_ |||_ ||_|#|_|'|_||&|_||&|_|(|_||)|_||)|_||_||_|j |_|j|_|j|_|j|_||j|_||+|_||+|_ddl},t |,!||j  |_"| | | | | }-|-|j" }.||.|_#||.|_$dS) Ni'z'Did not converge after %d tries with %srrzAcould not determine machine tolerance for 'negep', locals() -> %s )%ranger RuntimeErrorZdtypelocalsabsibetaitnegepepsnegZ _str_epsnegmachepepsZ_str_epsngrdiexpminexpxminZ _str_xminmaxexpxmaxZ _str_xmaxirndrepsilonZtinyZhugeZsmallest_normalZ_str_smallest_normalsmallest_subnormalZ_str_smallest_subnormalmathintlog10 precision resolutionZ_str_resolution)/rrrrrrZ max_iterNmsgonetwozeroa_tempZtemp1bZitemprbetarZbetahr*Ztempar Zbetainir!r"r#r$kztZnxresyr%ZmxZizr'r&r(r)jr,r-tenr1rrr r zsh                 $       $                       zMachAr._do_initcCsd}||jS)NaCMachine 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__)rfmtrrr __str__Ss zMachAr.__str__N) __name__ __module__ __qualname____doc__floatr.rr rDrrrr rsV Z__main__N) rH__all__Z fromnumericrZ _ufunc_configrZ_utilsrrrEprintrrrr s   T