From 6ca35ed4b9334e1c46f765e276ab65cc5b4f0afb Mon Sep 17 00:00:00 2001 From: blueloveTH Date: Fri, 22 Sep 2023 20:48:54 +0800 Subject: [PATCH] ... --- include/pocketpy/common.h | 38 +++++++++++++++++++------------------- tests/01_int.py | 2 ++ tests/02_float.py | 4 ++++ 3 files changed, 25 insertions(+), 19 deletions(-) diff --git a/include/pocketpy/common.h b/include/pocketpy/common.h index d14e2f5b..bb9971b0 100644 --- a/include/pocketpy/common.h +++ b/include/pocketpy/common.h @@ -101,18 +101,19 @@ union BitsCvtImpl<4>{ NumberTraits<4>::float_t _float; // 1 + 8 + 23 - int sign() const noexcept { return _int >> 31; } - unsigned int exp() const noexcept { return (_int >> 23) & 0b1111'1111; } - uint64_t mantissa() const noexcept { return _int & 0x7fffff; } + int sign() const { return _int >> 31; } + unsigned int exp() const { return (_int >> 23) & 0b1111'1111; } + uint64_t mantissa() const { return _int & 0x7fffff; } - void set_exp(int exp) noexcept { _int = (_int & 0x807f'ffff) | (exp << 23); } - void set_sign(int sign) noexcept { _int = (_int & 0x7fff'ffff) | (sign << 31); } - void zero_mantissa() noexcept { _int &= 0xff80'0000; } + void set_exp(int exp) { _int = (_int & 0x807f'ffff) | (exp << 23); } + void set_sign(int sign) { _int = (_int & 0x7fff'ffff) | (sign << 31); } + void zero_mantissa() { _int &= 0xff80'0000; } static constexpr int C0 = 127; // 2^7 - 1 static constexpr int C1 = -62; // 2 - 2^6 static constexpr int C2 = 63; // 2^6 - 1 static constexpr NumberTraits<4>::int_t C3 = 0b1011'1111'1111'1111'1111'1111'1111'1111; + static constexpr int C4 = 0b11111111; BitsCvtImpl(NumberTraits<4>::float_t val): _float(val) {} BitsCvtImpl(NumberTraits<4>::int_t val): _int(val) {} @@ -131,18 +132,19 @@ union BitsCvtImpl<8>{ NumberTraits<8>::float_t _float; // 1 + 11 + 52 - int sign() const noexcept { return _int >> 63; } - unsigned int exp() const noexcept { return (_int >> 52) & 0b0111'1111'1111; } - uint64_t mantissa() const noexcept { return _int & 0xfffffffffffff; } + int sign() const { return _int >> 63; } + unsigned int exp() const { return (_int >> 52) & 0b0111'1111'1111; } + uint64_t mantissa() const { return _int & 0xfffffffffffff; } - void set_exp(uint64_t exp) noexcept { _int = (_int & 0x800f'ffff'ffff'ffff) | (exp << 52); } - void set_sign(uint64_t sign) noexcept { _int = (_int & 0x7fff'ffff'ffff'ffff) | (sign << 63); } - void zero_mantissa() noexcept { _int &= 0xfff0'0000'0000'0000; } + void set_exp(uint64_t exp) { _int = (_int & 0x800f'ffff'ffff'ffff) | (exp << 52); } + void set_sign(uint64_t sign) { _int = (_int & 0x7fff'ffff'ffff'ffff) | (sign << 63); } + void zero_mantissa() { _int &= 0xfff0'0000'0000'0000; } static constexpr int C0 = 1023; // 2^10 - 1 static constexpr int C1 = -510; // 2 - 2^9 static constexpr int C2 = 511; // 2^9 - 1 static constexpr NumberTraits<8>::int_t C3 = 0b1011'1111'1111'1111'1111'1111'1111'1111'1111'1111'1111'1111'1111'1111'1111'1111; + static constexpr int C4 = 0b11111111111; BitsCvtImpl(NumberTraits<8>::float_t val): _float(val) {} BitsCvtImpl(NumberTraits<8>::int_t val): _int(val) {} @@ -173,9 +175,9 @@ struct Type { int index; Type(): index(-1) {} Type(int index): index(index) {} - bool operator==(Type other) const noexcept { return this->index == other.index; } - bool operator!=(Type other) const noexcept { return this->index != other.index; } - operator int() const noexcept { return this->index; } + bool operator==(Type other) const { return this->index == other.index; } + bool operator!=(Type other) const { return this->index != other.index; } + operator int() const { return this->index; } }; #define PK_LAMBDA(x) ([](VM* vm, ArgsView args) { return x; }) @@ -196,7 +198,6 @@ struct PyObject; inline PyObject* tag_float(f64 val){ BitsCvt decomposed(val); // std::cout << "tagging: " << val << std::endl; - // decomposed.print(); int sign = decomposed.sign(); int exp_7b = decomposed.exp() - BitsCvt::C0; if(exp_7b < BitsCvt::C1){ @@ -207,20 +208,19 @@ inline PyObject* tag_float(f64 val){ if(!std::isnan(val)) decomposed.zero_mantissa(); } decomposed.set_exp(exp_7b + BitsCvt::C2); - // decomposed.print(); decomposed._int = (decomposed._int << 1) | 0b01; decomposed.set_sign(sign); - // decomposed.print(); return reinterpret_cast(decomposed._int); } inline f64 untag_float(PyObject* val){ BitsCvt decomposed(reinterpret_cast(val)); + // std::cout << "untagging: " << val << std::endl; decomposed._int = (decomposed._int >> 1) & BitsCvt::C3; unsigned int exp_7b = decomposed.exp(); if(exp_7b == 0) return 0.0f; if(exp_7b == BitsCvt::C0){ - decomposed.set_exp(-1); + decomposed.set_exp(BitsCvt::C4); return decomposed._float; } decomposed.set_exp(exp_7b - BitsCvt::C2 + BitsCvt::C0); diff --git a/tests/01_int.py b/tests/01_int.py index f7a73aa9..07b8d793 100644 --- a/tests/01_int.py +++ b/tests/01_int.py @@ -2,6 +2,8 @@ assert 0xffff == 65535 assert 0xAAFFFF == 11206655 assert 0x7fffffff == 2147483647 +# test 64-bit +assert 2**60-1 + 546 - 0xfffffffffffff == 1148417904979477026 # test == != >= <= < > assert -1 == -1 diff --git a/tests/02_float.py b/tests/02_float.py index 16293366..fa4794ae 100644 --- a/tests/02_float.py +++ b/tests/02_float.py @@ -55,3 +55,7 @@ assert -1/0 == -inf assert 1/inf == 0 assert -1/inf == 0 assert math.isnan(0/0) + +assert 2**-600 == 0.0 +assert 2.0 ** 600 == inf +assert (-2.0) ** 601 == -inf