diff options
author | Arne Döring <arne.doering@gmx.net> | 2018-10-28 11:56:30 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-10-28 11:56:30 +0100 |
commit | 2fa13040b99350c96e20550f4768043d708f0742 (patch) | |
tree | 3ab663ad9d4ce2efa993bedc6bacc24974e140fd /tests | |
parent | f2cd8ed99a7caa00b20bae2443cacf2d97700d75 (diff) | |
parent | 2f781781d0e3a73d90f01b8056b8d50b65536eb9 (diff) | |
download | Nim-2fa13040b99350c96e20550f4768043d708f0742.tar.gz |
Merge pull request #9496 from cooldome/vm_float_casts
VM: add int <-> float casts of the same size
Diffstat (limited to 'tests')
-rw-r--r-- | tests/vm/tcastint.nim | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/tests/vm/tcastint.nim b/tests/vm/tcastint.nim index 7b9ddd7d9..f9d42fc54 100644 --- a/tests/vm/tcastint.nim +++ b/tests/vm/tcastint.nim @@ -113,8 +113,55 @@ proc test() = doAssert(not compiles(cast[uint32](I8))) doAssert(not compiles(cast[uint64](I8))) + +proc test_float_cast = + + const + exp_bias = 1023'i64 + exp_shift = 52 + exp_mask = 0x7ff'i64 shl exp_shift + mantissa_mask = 0xfffffffffffff'i64 + + let f = 8.0 + let fx = cast[int64](f) + let exponent = ((fx and exp_mask) shr exp_shift) - exp_bias + let mantissa = fx and mantissa_mask + doAssert(exponent == 3, $exponent) + doAssert(mantissa == 0, $mantissa) + + # construct 2^N float, where N is integer + let x = -2'i64 + let xx = (x + exp_bias) shl exp_shift + let xf = cast[float](xx) + doAssert(xf == 0.25, $xf) + +proc test_float32_cast = + + const + exp_bias = 127'i32 + exp_shift = 23 + exp_mask = 0x7f800000'i32 + mantissa_mask = 0x007ffff'i32 + + let f = -0.5'f32 + let fx = cast[int32](f) + let exponent = ((fx and exp_mask) shr exp_shift) - exp_bias + let mantissa = fx and mantissa_mask + doAssert(exponent == -1, $exponent) + doAssert(mantissa == 0, $mantissa) + + # construct 2^N float32 where N is integer + let x = 4'i32 + let xx = (x + exp_bias) shl exp_shift + let xf = cast[float32](xx) + doAssert(xf == 16.0'f32, $xf) + test() +test_float_cast() +test_float32_cast() static: test() + test_float_cast() + test_float32_cast() echo "OK" |