a
    W%bm                     @   sD   d Z ddlmZmZmZ ddlmZmZ d	ddZdd Z	dgZ
dS )
zD
``python-future``: pure Python implementation of Python 3 round().
    )PYPYPY26bind_method)DecimalROUND_HALF_EVENNc                 C   s   d}|du rd}d}t | dr(| |S |dk r8tdtd|  }trbdtt| v rbt| } t| trr| }n,t	st
| j|td	}nt| j|td	}|rt|S t|S dS )
a  
    See Python 3 documentation: uses Banker's Rounding.

    Delegates to the __round__ method if for some reason this exists.

    If not, rounds a number to a given precision in decimal digits (default
    0 digits). This returns an int when called with one argument,
    otherwise the same type as the number. ndigits may be negative.

    See the test_round method in future/tests/test_builtins.py for
    examples.
    FNTr   	__round__z"negative ndigits not supported yet10Znumpy)rounding)hasattrr   NotImplementedErrorr   r   reprtypefloat
isinstancer   
from_floatquantizer   from_float_26int)numberndigitsZ
return_intexponentd r   h/Users/vegardjervell/Documents/master/model/venv/lib/python3.9/site-packages/future/builtins/newround.pynewround   s,    


r   c           	      C   s   ddl }ddlm} t| ttfr*t| S || s>|| rJtt	| S |
d| dkr`d}nd}t|  \}}dd }||d }||t|d|  | }|S )	a  Converts a float to a decimal number, exactly.

    Note that Decimal.from_float(0.1) is not the same as Decimal('0.1').
    Since 0.1 is not exactly representable in binary floating point, the
    value is stored as the nearest representable value which is
    0x1.999999999999ap-4.  The exact equivalent of the value in decimal
    is 0.1000000000000000055511151231257827021181583404541015625.

    >>> Decimal.from_float(0.1)
    Decimal('0.1000000000000000055511151231257827021181583404541015625')
    >>> Decimal.from_float(float('nan'))
    Decimal('NaN')
    >>> Decimal.from_float(float('inf'))
    Decimal('Infinity')
    >>> Decimal.from_float(-float('inf'))
    Decimal('-Infinity')
    >>> Decimal.from_float(-0.0)
    Decimal('-0')

    r   N)_dec_from_tripleg      ?   c                 S   s$   | dkrt tt| d S dS d S )Nr      )lenbinabs)r   r   r   r   
bit_length\   s    z!from_float_26.<locals>.bit_length   )mathdecimalr   r   r   longr   isinfisnanr   copysignr    as_integer_ratiostr)	fZ_mathr   signnr   r!   kresultr   r   r   r   :   s    r   )N)__doc__Zfuture.utilsr   r   r   r$   r   r   r   r   __all__r   r   r   r   <module>   s
   
.,