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