o
    ,1]m                     @   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 rtdtd|  }tr1dtt| v r1t| } t| tr9| }nt	sFt
| j|td	}n	t| j|td	}|rUt|S t|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10numpy)rounding)hasattrr   NotImplementedErrorr   r   reprtypefloat
isinstancer   
from_floatquantizer   from_float_26int)numberndigits
return_intexponentd r   :/usr/lib/python3/dist-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|| r%tt	| S |
d| dkr0d}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 )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)	f_mathr   signnr   r#   kresultr   r   r   r   :   s   r   )N)__doc__future.utilsr   r   r   r&   r   r   r   r   __all__r   r   r   r   <module>   s    
.
,