
c'oT!                 @   s`   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 k r d } d } t  |  d  r: |  j |  S| d k  rR t d   t d  | } t r d t t |    k r t |   }  t s t j	 |   j
 | d	 t } n t |   j
 | d	 t } | r t |  St |  Sd 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 yetZ10ZnumpyZrounding)hasattrr   NotImplementedErrorr   r   reprtypefloatr   Z
from_floatZquantizer   from_float_26int)ZnumberZndigitsZ
return_intZ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| j |   sY | j |   ri t t	 |    S| j
 d |   d k r d } n d } t |   j   \ } } 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 Sd Sd  S)Nr      )lenbinabs)r   r   r   r   
bit_lengthY   s    z!from_float_26.<locals>.bit_length   )Zmathdecimalr   
isinstancer   Zlongr   ZisinfZisnanr
   Zcopysignr   as_integer_ratiostr)	fZ_mathr   Zsignnr   r   kresultr   r   r   r   7   s    
	!r   )__doc__Zfuture.utilsr   r   r   r   r   r   r   r   __all__r   r   r   r   <module>   s
   +,