1# Py2.x mixed true-div/floor-div behaviour of '/' operator
2
3
4def bigints(values):
5    for x in values:
6        print(repr(x).rstrip('L'))
7
8
9def doit(x,y):
10    """
11    >>> doit(1,2)
12    (0, 0)
13    >>> doit(4,3)
14    (1, 1)
15    >>> doit(4,3.0)
16    (1.3333333333333333, 1.0)
17    >>> doit(4,2)
18    (2, 2)
19    """
20    return x/y, x//y
21
22def doit_inplace(x,y):
23    """
24    >>> doit_inplace(1,2)
25    0
26    """
27    x /= y
28    return x
29
30def doit_inplace_floor(x,y):
31    """
32    >>> doit_inplace_floor(1,2)
33    0
34    """
35    x //= y
36    return x
37
38def constants():
39    """
40    >>> constants()
41    (0, 0, 2.5, 2.0, 2, 2)
42    """
43    return 1/2, 1//2, 5/2.0, 5//2.0, 5/2, 5//2
44
45
46def py_mix(a):
47    """
48    >>> py_mix(1)
49    (0, 0, 0.5, 0.0, 0, 0)
50    >>> py_mix(1.0)
51    (0.5, 0.0, 0.5, 0.0, 0.5, 0.0)
52    >>> 2**53 / 2.0
53    4503599627370496.0
54    >>> bigints(py_mix(2**53))
55    4503599627370496
56    4503599627370496
57    4503599627370496.0
58    4503599627370496.0
59    4503599627370496
60    4503599627370496
61    >>> bigints(py_mix(2**53 + 1))
62    4503599627370496
63    4503599627370496
64    4503599627370496.0
65    4503599627370496.0
66    4503599627370496
67    4503599627370496
68    >>> py_mix(2**53 + 1.0)
69    (4503599627370496.0, 4503599627370496.0, 4503599627370496.0, 4503599627370496.0, 4503599627370496.0, 4503599627370496.0)
70    """
71    return a/2, a//2, a/2.0, a//2.0, a/2, a//2
72
73
74def py_mix_by_neg1(a):
75    """
76    >>> py_mix_by_neg1(0)
77    (0, 0, -0.0, -0.0, 0, 0)
78    >>> py_mix_by_neg1(-1)
79    (1, 1, 1.0, 1.0, 1, 1)
80    >>> py_mix_by_neg1(int(2**31-1))
81    (-2147483647, -2147483647, -2147483647.0, -2147483647.0, -2147483647, -2147483647)
82    >>> bigints(py_mix_by_neg1(int(-2**31-1)))
83    2147483649
84    2147483649
85    2147483649.0
86    2147483649.0
87    2147483649
88    2147483649
89    >>> results = py_mix_by_neg1(int(2**63-1))
90    >>> results[2] == results[3] == float(2**63-1) / -1.0 or results
91    True
92    >>> results[0] == results[1] == results[4] == results[5] == (2**63-1) // -1 or results
93    True
94    >>> results = py_mix_by_neg1(int(-2**63-1))
95    >>> results[2] == results[3] == float(-2**63-1) / -1.0 or results
96    True
97    >>> results[0] == results[1] == results[4] == results[5] == (-2**63-1) // -1 or results
98    True
99    """
100    return a/-1, a//-1, a/-1.0, a//-1.0, a/-1, a//-1
101
102
103def py_mix_rev(a):
104    """
105    >>> py_mix_rev(4)
106    (0, 0, 1.25, 1.0, 1, 1)
107    >>> py_mix_rev(4.0)
108    (0.25, 0.0, 1.25, 1.0, 1.25, 1.0)
109    """
110    return 1/a, 1//a, 5.0/a, 5.0//a, 5/a, 5//a
111
112def int_mix(int a):
113    """
114    >>> int_mix(1)
115    (0, 0, 0.5, 0.0, 0, 0)
116    """
117    return a/2, a//2, a/2.0, a//2.0, a/2, a//2
118
119def int_mix_rev(int a):
120    """
121    >>> int_mix_rev(4)
122    (0, 0, 1.25, 1.0, 1, 1)
123    """
124    return 1/a, 1//a, 5.0/a, 5.0//a, 5/a, 5//a
125
126def float_mix(float a):
127    """
128    >>> float_mix(1.0)
129    (0.5, 0.0, 0.5, 0.0, 0.5, 0.0)
130    """
131    return a/2, a//2, a/2.0, a//2.0, a/2, a//2
132
133def float_mix_rev(float a):
134    """
135    >>> float_mix_rev(4.0)
136    (0.25, 0.0, 1.25, 1.0, 1.25, 1.0)
137    """
138    return 1/a, 1//a, 5.0/a, 5.0//a, 5/a, 5//a
139
140def int_int(int a, int b):
141    """
142    >>> int_int(1, 2)
143    (0, 2)
144    """
145    return a/b, b/a
146
147
148def div_by_0(a):
149    """
150    >>> div_by_0(0)
151    'OK'
152    >>> div_by_0(0.0)
153    'OK'
154    """
155    try:
156        1/a
157    except ZeroDivisionError:
158        pass
159    else:
160        return "FAIL 1"
161    try:
162        1//a
163    except ZeroDivisionError:
164        pass
165    else:
166        return "FAIL 2"
167    try:
168        5.0/a
169    except ZeroDivisionError:
170        pass
171    else:
172        return "FAIL 3"
173    try:
174        5.0//a
175    except ZeroDivisionError:
176        pass
177    else:
178        return "FAIL 4"
179    try:
180        5/a
181    except ZeroDivisionError:
182        pass
183    else:
184        return "FAIL 5"
185    try:
186        5//a
187    except ZeroDivisionError:
188        pass
189    else:
190        return "FAIL 6"
191    try:
192        (2**15)/a
193    except ZeroDivisionError:
194        pass
195    else:
196        return "FAIL 7"
197    try:
198        (2**15)//a
199    except ZeroDivisionError:
200        pass
201    else:
202        return "FAIL 8"
203    try:
204        (2**30)/a
205    except ZeroDivisionError:
206        pass
207    else:
208        return "FAIL 9"
209    try:
210        (2**30)//a
211    except ZeroDivisionError:
212        pass
213    else:
214        return "FAIL 10"
215    return 'OK'
216