cython

Форк
0
/
future_division.pyx 
229 строк · 4.4 Кб
1
from __future__ import division
2

3
cimport cython
4

5

6
def bigints(values):
7
    for x in values:
8
        print(repr(x).rstrip('L'))
9

10

11
def doit(x,y):
12
    """
13
    >>> doit(1,2)
14
    (0.5, 0)
15
    >>> doit(4,3)
16
    (1.3333333333333333, 1)
17
    >>> doit(4,3.0)
18
    (1.3333333333333333, 1.0)
19
    >>> doit(4,2)
20
    (2.0, 2)
21
    """
22
    return x/y, x//y
23

24
def doit_inplace(x,y):
25
    """
26
    >>> doit_inplace(1,2)
27
    0.5
28
    """
29
    x /= y
30
    return x
31

32
def doit_inplace_floor(x,y):
33
    """
34
    >>> doit_inplace_floor(1,2)
35
    0
36
    """
37
    x //= y
38
    return x
39

40
def constants():
41
    """
42
    >>> constants()
43
    (0.5, 0, 2.5, 2.0, 2.5, 2)
44
    """
45
    return 1/2, 1//2, 5/2.0, 5//2.0, 5/2, 5//2
46

47

48
def py_mix(a):
49
    """
50
    >>> py_mix(1)
51
    (0.5, 0, 0.5, 0.0, 0.5, 0)
52
    >>> py_mix(1.0)
53
    (0.5, 0.0, 0.5, 0.0, 0.5, 0.0)
54
    >>> 2**53 / 2.0
55
    4503599627370496.0
56
    >>> bigints(py_mix(2**53))
57
    4503599627370496.0
58
    4503599627370496
59
    4503599627370496.0
60
    4503599627370496.0
61
    4503599627370496.0
62
    4503599627370496
63
    >>> bigints(py_mix(2**53 + 1))
64
    4503599627370496.0
65
    4503599627370496
66
    4503599627370496.0
67
    4503599627370496.0
68
    4503599627370496.0
69
    4503599627370496
70
    >>> py_mix(2**53 + 1.0)
71
    (4503599627370496.0, 4503599627370496.0, 4503599627370496.0, 4503599627370496.0, 4503599627370496.0, 4503599627370496.0)
72
    """
73
    return a/2, a//2, a/2.0, a//2.0, a/2, a//2
74

75

76
def py_mix_by_neg1(a):
77
    """
78
    >>> py_mix_by_neg1(0)
79
    (-0.0, 0, -0.0, -0.0, -0.0, 0)
80
    >>> py_mix_by_neg1(-1)
81
    (1.0, 1, 1.0, 1.0, 1.0, 1)
82
    >>> py_mix_by_neg1(int(2**31-1))
83
    (-2147483647.0, -2147483647, -2147483647.0, -2147483647.0, -2147483647.0, -2147483647)
84
    >>> bigints(py_mix_by_neg1(int(-2**31-1)))
85
    2147483649.0
86
    2147483649
87
    2147483649.0
88
    2147483649.0
89
    2147483649.0
90
    2147483649
91
    >>> results = py_mix_by_neg1(int(2**63-1))
92
    >>> results[0] == results[2] == results[3] == results[4] == float(2**63-1) / -1.0 or results
93
    True
94
    >>> results[1] == results[5] == (2**63-1) // -1 or results
95
    True
96
    >>> results = py_mix_by_neg1(int(-2**63-1))
97
    >>> results[0] == results[2] == results[3] == results[4] == float(-2**63-1) / -1.0 or results
98
    True
99
    >>> results[1] == results[5] == (-2**63-1) // -1 or results
100
    True
101
    """
102
    return a/-1, a//-1, a/-1.0, a//-1.0, a/-1, a//-1
103

104

105
def py_mix_rev(a):
106
    """
107
    >>> py_mix_rev(4)
108
    (0.25, 0, 1.25, 1.0, 1.25, 1)
109
    >>> py_mix_rev(4.0)
110
    (0.25, 0.0, 1.25, 1.0, 1.25, 1.0)
111
    """
112
    return 1/a, 1//a, 5.0/a, 5.0//a, 5/a, 5//a
113

114
def int_mix(int a):
115
    """
116
    >>> int_mix(1)
117
    (0.5, 0, 0.5, 0.0, 0.5, 0)
118
    """
119
    return a/2, a//2, a/2.0, a//2.0, a/2, a//2
120

121
def int_mix_rev(int a):
122
    """
123
    >>> int_mix_rev(4)
124
    (0.25, 0, 1.25, 1.0, 1.25, 1)
125
    """
126
    return 1/a, 1//a, 5.0/a, 5.0//a, 5/a, 5//a
127

128
def float_mix(float a):
129
    """
130
    >>> float_mix(1.0)
131
    (0.5, 0.0, 0.5, 0.0, 0.5, 0.0)
132
    """
133
    return a/2, a//2, a/2.0, a//2.0, a/2, a//2
134

135
def float_mix_rev(float a):
136
    """
137
    >>> float_mix_rev(4.0)
138
    (0.25, 0.0, 1.25, 1.0, 1.25, 1.0)
139
    """
140
    return 1/a, 1//a, 5.0/a, 5.0//a, 5/a, 5//a
141

142

143
def infer_division_type():
144
    """
145
    >>> v = infer_division_type()
146
    double
147
    >>> v
148
    8333333.25
149
    """
150
    v = (10000**2 - 1) / 12
151
    print(cython.typeof(v))
152
    return v
153

154
def int_int(int a, int b):
155
    """
156
    >>> int_int(1, 2)
157
    (0.5, 2.0)
158
    """
159
    return a/b, b/a
160

161

162
def div_by_0(a):
163
    """
164
    >>> div_by_0(0)
165
    'OK'
166
    >>> div_by_0(0.0)
167
    'OK'
168
    """
169
    try:
170
        1/a
171
    except ZeroDivisionError:
172
        pass
173
    else:
174
        return "FAIL 1"
175
    try:
176
        1//a
177
    except ZeroDivisionError:
178
        pass
179
    else:
180
        return "FAIL 2"
181
    try:
182
        5.0/a
183
    except ZeroDivisionError:
184
        pass
185
    else:
186
        return "FAIL 3"
187
    try:
188
        5.0//a
189
    except ZeroDivisionError:
190
        pass
191
    else:
192
        return "FAIL 4"
193
    try:
194
        5/a
195
    except ZeroDivisionError:
196
        pass
197
    else:
198
        return "FAIL 5"
199
    try:
200
        5//a
201
    except ZeroDivisionError:
202
        pass
203
    else:
204
        return "FAIL 6"
205
    try:
206
        (2**15)/a
207
    except ZeroDivisionError:
208
        pass
209
    else:
210
        return "FAIL 7"
211
    try:
212
        (2**15)//a
213
    except ZeroDivisionError:
214
        pass
215
    else:
216
        return "FAIL 8"
217
    try:
218
        (2**30)/a
219
    except ZeroDivisionError:
220
        pass
221
    else:
222
        return "FAIL 9"
223
    try:
224
        (2**30)//a
225
    except ZeroDivisionError:
226
        pass
227
    else:
228
        return "FAIL 10"
229
    return 'OK'
230

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.