| 1 | import math |
| 2 | |
| 3 | fn test_float_decl() { |
| 4 | // TODO: ARM64 backend doesn't support typeof() |
| 5 | // z := 1f |
| 6 | // assert z > 0 |
| 7 | x1 := 1e10 |
| 8 | x2 := -2e16 |
| 9 | x3 := 1e-15 |
| 10 | x4 := -9e-4 |
| 11 | // assert typeof(x1).name == 'f64' |
| 12 | // assert typeof(x2).name == 'f64' |
| 13 | // assert typeof(x3).name == 'f64' |
| 14 | // assert typeof(x4).name == 'f64' |
| 15 | x5 := 4e108 |
| 16 | x6 := -7e99 |
| 17 | x7 := 3e-205 |
| 18 | x8 := -6e-147 |
| 19 | // assert typeof(x5).name == 'f64' |
| 20 | // assert typeof(x6).name == 'f64' |
| 21 | // assert typeof(x7).name == 'f64' |
| 22 | // assert typeof(x8).name == 'f64' |
| 23 | x9 := 312874834.77 |
| 24 | x10 := -22399994.06 |
| 25 | x11 := 0.0000000019 |
| 26 | x12 := -0.00000000008 |
| 27 | // assert typeof(x9).name == 'f64' |
| 28 | // assert typeof(x10).name == 'f64' |
| 29 | // assert typeof(x11).name == 'f64' |
| 30 | // assert typeof(x12).name == 'f64' |
| 31 | x13 := 34234234809890890898903213154353453453253253243432413232228908902183918392183902432432438980380123021983901392183921389083913890389089031.0 |
| 32 | x14 := -39999999999999999999222212128182813294989082302832183928343325325233253242312331324392839238239829389038097438248932789371837218372837293.8 |
| 33 | x15 := 0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002 |
| 34 | x16 := -0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004 |
| 35 | // assert typeof(x13).name == 'f64' |
| 36 | // assert typeof(x14).name == 'f64' |
| 37 | // assert typeof(x15).name == 'f64' |
| 38 | // assert typeof(x16).name == 'f64' |
| 39 | _ = x1 |
| 40 | _ = x2 |
| 41 | _ = x3 |
| 42 | _ = x4 |
| 43 | _ = x5 |
| 44 | _ = x6 |
| 45 | _ = x7 |
| 46 | _ = x8 |
| 47 | _ = x9 |
| 48 | _ = x10 |
| 49 | _ = x11 |
| 50 | _ = x12 |
| 51 | _ = x13 |
| 52 | _ = x14 |
| 53 | _ = x15 |
| 54 | _ = x16 |
| 55 | } |
| 56 | |
| 57 | fn test_f32_equal_operator() { |
| 58 | b := f32(1.0) |
| 59 | mut a := f32(1.0) |
| 60 | a += 0.0000019073486328125 |
| 61 | assert a != b |
| 62 | a -= 0.0000019073486328125 |
| 63 | assert a == b |
| 64 | assert -1 == 1 * -1 |
| 65 | assert -1.0 == 1.0 * -1.0 |
| 66 | a = 1 |
| 67 | a += 0.0000019073486328125 |
| 68 | a -= 0.0000019073486328125 |
| 69 | assert a == f32(1.0) |
| 70 | a += 0.000001 |
| 71 | assert !(a < f32(1)) |
| 72 | assert !(a <= f32(1)) |
| 73 | assert a > f32(1) |
| 74 | assert a >= 1 |
| 75 | assert a != 1 |
| 76 | f := 1.2 |
| 77 | ab := int(f) |
| 78 | assert ab == 1 |
| 79 | e := f32(-1.602176634e-19) |
| 80 | m := f32(9.1093837015e-31) |
| 81 | assert e < m |
| 82 | assert e <= m |
| 83 | assert e != m |
| 84 | assert !(e == m) |
| 85 | assert m >= e |
| 86 | assert m > e |
| 87 | } |
| 88 | |
| 89 | fn test_f64_equal_operator() { |
| 90 | b := 1.0 |
| 91 | mut a := 1.0 |
| 92 | a += 0.0000019073486328125 |
| 93 | assert a != b |
| 94 | a -= 0.0000019073486328125 |
| 95 | assert a == b |
| 96 | e := -1.602176634e-19 |
| 97 | m := 9.1093837015e-31 |
| 98 | assert e < m |
| 99 | assert e <= m |
| 100 | assert e != m |
| 101 | assert !(e == m) |
| 102 | assert m >= e |
| 103 | assert m > e |
| 104 | } |
| 105 | |
| 106 | fn test_f64_eq_epsilon() { |
| 107 | a := 1.662248544459347e308 |
| 108 | b := 1.662248544459348e308 |
| 109 | x := 1.662248544459352e308 |
| 110 | assert a != b |
| 111 | assert a.eq_epsilon(b) |
| 112 | assert b.eq_epsilon(a) |
| 113 | assert (-a).eq_epsilon(-b) |
| 114 | assert (-b).eq_epsilon(-a) |
| 115 | assert !a.eq_epsilon(x) |
| 116 | assert !x.eq_epsilon(a) |
| 117 | assert !a.eq_epsilon(-b) |
| 118 | assert !(-a).eq_epsilon(b) |
| 119 | c := 1.5367748374385438503 |
| 120 | d := -1.5367748374385447257 |
| 121 | z := 1.5367748378943546 |
| 122 | assert c != -d |
| 123 | assert c.eq_epsilon(-d) |
| 124 | assert d.eq_epsilon(-c) |
| 125 | assert !c.eq_epsilon(z) |
| 126 | assert !z.eq_epsilon(c) |
| 127 | e := 2.531434251587394233e-308 |
| 128 | f := 2.531434251587395675e-308 |
| 129 | y := 2.531434251587398934e-308 |
| 130 | assert e != f |
| 131 | assert e.eq_epsilon(f) |
| 132 | assert (-f).eq_epsilon(-e) |
| 133 | assert !e.eq_epsilon(y) |
| 134 | assert !(-y).eq_epsilon(-e) |
| 135 | } |
| 136 | |
| 137 | fn test_f32_eq_epsilon() { |
| 138 | a := f32(3.244331e38) |
| 139 | b := f32(3.244332e38) |
| 140 | x := f32(3.244338e38) |
| 141 | assert a != b |
| 142 | assert a.eq_epsilon(b) |
| 143 | assert b.eq_epsilon(a) |
| 144 | assert (-a).eq_epsilon(-b) |
| 145 | assert (-b).eq_epsilon(-a) |
| 146 | assert !a.eq_epsilon(x) |
| 147 | assert !(-x).eq_epsilon(-a) |
| 148 | assert !a.eq_epsilon(-b) |
| 149 | assert !(-a).eq_epsilon(b) |
| 150 | c := f32(0.9546742) |
| 151 | d := f32(-0.9546745) |
| 152 | z := f32(0.9546754) |
| 153 | assert c != -d |
| 154 | assert c.eq_epsilon(-d) |
| 155 | assert d.eq_epsilon(-c) |
| 156 | assert !c.eq_epsilon(z) |
| 157 | assert !z.eq_epsilon(c) |
| 158 | e := f32(-1.5004390e-38) |
| 159 | f := f32(-1.5004395e-38) |
| 160 | y := f32(-1.5004409e-38) |
| 161 | assert e != f |
| 162 | assert e.eq_epsilon(f) |
| 163 | assert (-f).eq_epsilon(-e) |
| 164 | assert !e.eq_epsilon(y) |
| 165 | assert !(-y).eq_epsilon(-e) |
| 166 | } |
| 167 | |
| 168 | fn test_float_point_formatting_rounding() { |
| 169 | float_1 := 462.18 |
| 170 | float_2 := 45.02227 |
| 171 | float_3 := 238.5 |
| 172 | float_4 := 239.5 |
| 173 | |
| 174 | assert '${float_1:0.0f}' == '462' |
| 175 | assert '${float_2:0.0f}' == '45' |
| 176 | assert '${float_3:0.0f}' == '239' |
| 177 | assert '${float_4:0.0f}' == '240' |
| 178 | |
| 179 | assert '${239.5555551:0.0f}' == '240' |
| 180 | assert '${239.5555551:0.1f}' == '239.6' |
| 181 | assert '${239.5555551:0.2f}' == '239.56' |
| 182 | assert '${239.5555551:0.3f}' == '239.556' |
| 183 | assert '${239.5555551:0.4f}' == '239.5556' |
| 184 | assert '${239.5555551:0.5f}' == '239.55556' |
| 185 | assert '${239.5555551:0.6f}' == '239.555555' |
| 186 | assert '${239.5555551:0.7f}' == '239.5555551' |
| 187 | assert '${239.5555551:0.8f}' == '239.55555510' |
| 188 | assert '${239.5555551:0.9f}' == '239.555555100' |
| 189 | assert '${239.5555551:0.10f}' == '239.5555551000' |
| 190 | assert '${239.5555551:0.11f}' == '239.55555510000' |
| 191 | |
| 192 | assert '${239.5:0.0f}' == '240' |
| 193 | assert '${239.55:0.1f}' == '239.6' |
| 194 | assert '${239.555:0.2f}' == '239.56' |
| 195 | assert '${239.5555:0.3f}' == '239.555' // Note: 5 ? |
| 196 | assert '${239.55555:0.4f}' == '239.5556' |
| 197 | assert '${239.555555:0.5f}' == '239.55555' // Note: 5 ? |
| 198 | assert '${239.5555555:0.6f}' == '239.555556' // after this, it is all ending in 6 |
| 199 | assert '${239.55555555:0.7f}' == '239.5555556' |
| 200 | assert '${239.555555555:0.8f}' == '239.55555556' |
| 201 | assert '${239.5555555555:0.9f}' == '239.555555556' |
| 202 | assert '${239.55555555555:0.10f}' == '239.5555555556' |
| 203 | |
| 204 | assert '${239.5550:0.3f}' == '239.555' |
| 205 | assert '${239.5551:0.3f}' == '239.555' |
| 206 | assert '${239.5552:0.3f}' == '239.555' |
| 207 | assert '${239.5553:0.3f}' == '239.555' |
| 208 | assert '${239.5554:0.3f}' == '239.555' |
| 209 | assert '${239.5555:0.3f}' == '239.555' |
| 210 | assert '${239.5556:0.3f}' == '239.556' // rounding at last 6 ? |
| 211 | assert '${239.5557:0.3f}' == '239.556' |
| 212 | assert '${239.5558:0.3f}' == '239.556' |
| 213 | assert '${239.5559:0.3f}' == '239.556' |
| 214 | |
| 215 | assert '${239.5555551:0.6f}' == '239.555555' |
| 216 | assert '${239.5555552:0.6f}' == '239.555555' |
| 217 | assert '${239.5555553:0.6f}' == '239.555555' |
| 218 | assert '${239.5555554:0.6f}' == '239.555555' |
| 219 | assert '${239.5555555:0.6f}' == '239.555556' |
| 220 | assert '${239.5555556:0.6f}' == '239.555556' |
| 221 | assert '${239.5555557:0.6f}' == '239.555556' |
| 222 | assert '${239.5555558:0.6f}' == '239.555556' |
| 223 | assert '${239.5555559:0.6f}' == '239.555556' |
| 224 | |
| 225 | assert '${239.55555555555:0.10f}' == '239.5555555556' |
| 226 | assert '${239.55555555555:0.9f}' == '239.555555556' |
| 227 | assert '${239.55555555555:0.8f}' == '239.55555556' |
| 228 | assert '${239.55555555555:0.7f}' == '239.5555556' |
| 229 | assert '${239.55555555555:0.6f}' == '239.555556' |
| 230 | assert '${239.55555555555:0.5f}' == '239.55556' |
| 231 | assert '${239.55555555555:0.4f}' == '239.5556' |
| 232 | assert '${239.55555555555:0.3f}' == '239.556' |
| 233 | assert '${239.55555555555:0.2f}' == '239.56' |
| 234 | assert '${239.55555555555:0.1f}' == '239.6' |
| 235 | assert '${239.55555555555:0.0f}' == '240' |
| 236 | |
| 237 | assert '${-239.55555555555:0.10f}' == '-239.5555555556' |
| 238 | assert '${-239.55555555555:0.9f}' == '-239.555555556' |
| 239 | assert '${-239.55555555555:0.8f}' == '-239.55555556' |
| 240 | assert '${-239.55555555555:0.7f}' == '-239.5555556' |
| 241 | assert '${-239.55555555555:0.6f}' == '-239.555556' |
| 242 | assert '${-239.55555555555:0.5f}' == '-239.55556' |
| 243 | assert '${-239.55555555555:0.4f}' == '-239.5556' |
| 244 | assert '${-239.55555555555:0.3f}' == '-239.556' |
| 245 | assert '${-239.55555555555:0.2f}' == '-239.56' |
| 246 | assert '${-239.55555555555:0.1f}' == '-239.6' |
| 247 | assert '${-239.55555555555:0.0f}' == '-240' |
| 248 | } |
| 249 | |
| 250 | fn test_float_zero_str() { |
| 251 | f1 := f32(0.0) |
| 252 | f2 := 0.0 |
| 253 | assert f1.str() == '0.0' |
| 254 | assert '${f1}' == '0.0' |
| 255 | assert f2.str() == '0.0' |
| 256 | assert '${f2}' == '0.0' |
| 257 | } |
| 258 | |
| 259 | fn test_f32_zero_chars() { |
| 260 | bits := math.f32_bits('-0.0'.f32()) |
| 261 | assert math.f32_bits('-0 ms'.f32()) == bits |
| 262 | assert math.f32_bits('-0.0 ms'.f32()) == bits |
| 263 | assert math.f32_bits('-0.000 ms'.f32()) == bits |
| 264 | assert math.f32_bits('0 ms'.f32()) == 0 |
| 265 | assert math.f32_bits('0.0 ms'.f32()) == 0 |
| 266 | assert math.f32_bits('0.000 ms'.f32()) == 0 |
| 267 | assert math.f32_bits('-0'.f32()) == bits |
| 268 | assert math.f32_bits('-0.0'.f32()) == bits |
| 269 | assert math.f32_bits('-0.000'.f32()) == bits |
| 270 | assert math.f32_bits('0'.f32()) == 0 |
| 271 | assert math.f32_bits('0.0'.f32()) == 0 |
| 272 | assert math.f32_bits('0.000'.f32()) == 0 |
| 273 | assert '-0 ms'.f32().str() == '-0.0' |
| 274 | assert '-0.0 ms'.f32().str() == '-0.0' |
| 275 | assert '-0.000 ms'.f32().str() == '-0.0' |
| 276 | assert '0 ms'.f32().str() == '0.0' |
| 277 | assert '0.0 ms'.f32().str() == '0.0' |
| 278 | assert '0.000 ms'.f32().str() == '0.0' |
| 279 | assert '-0'.f32().str() == '-0.0' |
| 280 | assert '-0.0'.f32().str() == '-0.0' |
| 281 | assert '-0.000'.f32().str() == '-0.0' |
| 282 | assert '0'.f32().str() == '0.0' |
| 283 | assert '0.0'.f32().str() == '0.0' |
| 284 | assert '0.00'.f32().str() == '0.0' |
| 285 | } |
| 286 | |
| 287 | fn test_f64_zero_chars() { |
| 288 | bits := math.f64_bits('-0.0'.f64()) |
| 289 | assert math.f64_bits('-0 ms'.f64()) == bits |
| 290 | assert math.f64_bits('-0.0 ms'.f64()) == bits |
| 291 | assert math.f64_bits('-0.000 ms'.f64()) == bits |
| 292 | assert math.f64_bits('0 ms'.f64()) == 0 |
| 293 | assert math.f64_bits('0.0 ms'.f64()) == 0 |
| 294 | assert math.f64_bits('0.000 ms'.f64()) == 0 |
| 295 | assert math.f64_bits('-0'.f64()) == bits |
| 296 | assert math.f64_bits('-0.0'.f64()) == bits |
| 297 | assert math.f64_bits('-0.000'.f64()) == bits |
| 298 | assert math.f64_bits('0'.f64()) == 0 |
| 299 | assert math.f64_bits('0.0'.f64()) == 0 |
| 300 | assert math.f64_bits('0.000'.f64()) == 0 |
| 301 | assert '-0 ms'.f64().str() == '-0.0' |
| 302 | assert '-0.0 ms'.f64().str() == '-0.0' |
| 303 | assert '-0.000 ms'.f64().str() == '-0.0' |
| 304 | assert '0 ms'.f64().str() == '0.0' |
| 305 | assert '0.0 ms'.f64().str() == '0.0' |
| 306 | assert '0.000 ms'.f64().str() == '0.0' |
| 307 | assert '-0'.f64().str() == '-0.0' |
| 308 | assert '-0.0'.f64().str() == '-0.0' |
| 309 | assert '-0.000'.f64().str() == '-0.0' |
| 310 | assert '0'.f64().str() == '0.0' |
| 311 | assert '0.0'.f64().str() == '0.0' |
| 312 | assert '0.00'.f64().str() == '0.0' |
| 313 | } |
| 314 | |