B
    udv                 @   sP   d Z ddlm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().
    )division)PYPYPY26bind_method)DecimalROUND_HALF_EVENNc             C   s   d}|dkrd}d}t | dr(| |S td|  }dtt| krNt| } t| tr^| }ntsnt| }nt	| }|dk rt
|| | }n|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__10numpy)rounding)hasattrr   r   reprtypefloat
isinstancer   
from_floatfrom_float_26newroundquantizer   int)numberndigitsZ
return_intexponentdresult r   e/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/site-packages/future/builtins/newround.pyr      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#   kr   r   r   r   r   =   s    r   )N)__doc__
__future__r   Zfuture.utilsr   r   r   r&   r   r   r   r   __all__r   r   r   r   <module>   s   
0,