mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-20 11:30:18 +00:00
...
This commit is contained in:
parent
b92cba1c70
commit
148900b4ed
@ -20,6 +20,7 @@
|
|||||||
#include <variant>
|
#include <variant>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include <random>
|
#include <random>
|
||||||
|
#include <bitset>
|
||||||
|
|
||||||
#define PK_VERSION "1.2.2"
|
#define PK_VERSION "1.2.2"
|
||||||
|
|
||||||
@ -99,11 +100,13 @@ union BitsCvtImpl<4>{
|
|||||||
NumberTraits<4>::int_t _int;
|
NumberTraits<4>::int_t _int;
|
||||||
NumberTraits<4>::float_t _float;
|
NumberTraits<4>::float_t _float;
|
||||||
|
|
||||||
struct{
|
// 1 + 8 + 23
|
||||||
unsigned int sign: 1;
|
unsigned int sign() const noexcept { return _int >> 31; }
|
||||||
unsigned int exp: 8;
|
unsigned int exp() const noexcept { return (_int >> 23) & 0b1111'1111; }
|
||||||
uint64_t mantissa: 23;
|
uint64_t mantissa() const noexcept { return _int & 0x7fffff; }
|
||||||
} _float_bits;
|
|
||||||
|
void set_exp(uint64_t exp) noexcept { _int = (_int & 0x807f'ffff) | (exp << 23); }
|
||||||
|
void zero_mantissa() noexcept { _int &= 0xff80'0000; }
|
||||||
|
|
||||||
static constexpr int C0 = 127; // 2^7 - 1
|
static constexpr int C0 = 127; // 2^7 - 1
|
||||||
static constexpr int C1 = -62; // 2 - 2^6
|
static constexpr int C1 = -62; // 2 - 2^6
|
||||||
@ -112,6 +115,13 @@ union BitsCvtImpl<4>{
|
|||||||
|
|
||||||
BitsCvtImpl(NumberTraits<4>::float_t val): _float(val) {}
|
BitsCvtImpl(NumberTraits<4>::float_t val): _float(val) {}
|
||||||
BitsCvtImpl(NumberTraits<4>::int_t val): _int(val) {}
|
BitsCvtImpl(NumberTraits<4>::int_t val): _int(val) {}
|
||||||
|
|
||||||
|
void print(){
|
||||||
|
std::string s = std::bitset<32>(_int).to_string();
|
||||||
|
std::cout << s.substr(0, 1) << '|';
|
||||||
|
std::cout << s.substr(1, 8) << '|';
|
||||||
|
std::cout << s.substr(9) << std::endl;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
@ -119,11 +129,13 @@ union BitsCvtImpl<8>{
|
|||||||
NumberTraits<8>::int_t _int;
|
NumberTraits<8>::int_t _int;
|
||||||
NumberTraits<8>::float_t _float;
|
NumberTraits<8>::float_t _float;
|
||||||
|
|
||||||
struct{
|
// 1 + 11 + 52
|
||||||
unsigned int sign: 1;
|
unsigned int sign() const noexcept { return _int >> 63; }
|
||||||
unsigned int exp: 11;
|
unsigned int exp() const noexcept { return (_int >> 52) & 0b0111'1111'1111; }
|
||||||
uint64_t mantissa: 52;
|
uint64_t mantissa() const noexcept { return _int & 0xfffffffffffff; }
|
||||||
} _float_bits;
|
|
||||||
|
void set_exp(uint64_t exp) noexcept { _int = (_int & 0x800f'ffff'ffff'ffff) | (exp << 52); }
|
||||||
|
void zero_mantissa() noexcept { _int &= 0xfff0'0000'0000'0000; }
|
||||||
|
|
||||||
static constexpr int C0 = 1023; // 2^10 - 1
|
static constexpr int C0 = 1023; // 2^10 - 1
|
||||||
static constexpr int C1 = -510; // 2 - 2^9
|
static constexpr int C1 = -510; // 2 - 2^9
|
||||||
@ -132,6 +144,13 @@ union BitsCvtImpl<8>{
|
|||||||
|
|
||||||
BitsCvtImpl(NumberTraits<8>::float_t val): _float(val) {}
|
BitsCvtImpl(NumberTraits<8>::float_t val): _float(val) {}
|
||||||
BitsCvtImpl(NumberTraits<8>::int_t val): _int(val) {}
|
BitsCvtImpl(NumberTraits<8>::int_t val): _int(val) {}
|
||||||
|
|
||||||
|
void print(){
|
||||||
|
std::string s = std::bitset<64>(_int).to_string();
|
||||||
|
std::cout << s.substr(0, 1) << '|';
|
||||||
|
std::cout << s.substr(1, 11) << '|';
|
||||||
|
std::cout << s.substr(12) << std::endl;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
using BitsCvt = BitsCvtImpl<sizeof(void*)>;
|
using BitsCvt = BitsCvtImpl<sizeof(void*)>;
|
||||||
@ -174,29 +193,35 @@ struct PyObject;
|
|||||||
|
|
||||||
inline PyObject* tag_float(f64 val){
|
inline PyObject* tag_float(f64 val){
|
||||||
BitsCvt decomposed(val);
|
BitsCvt decomposed(val);
|
||||||
int exp_7b = decomposed._float_bits.exp - BitsCvt::C0;
|
// std::cout << "tagging: " << val << std::endl;
|
||||||
|
// decomposed.print();
|
||||||
|
// std::cout << "exp: " << decomposed.exp() << std::endl;
|
||||||
|
int exp_7b = decomposed.exp() - BitsCvt::C0;
|
||||||
|
std::cout << "exp_7b: " << exp_7b << std::endl;
|
||||||
if(exp_7b < BitsCvt::C1){
|
if(exp_7b < BitsCvt::C1){
|
||||||
exp_7b = BitsCvt::C1 - 1; // -63 + 63 = 0
|
exp_7b = BitsCvt::C1 - 1; // -63 + 63 = 0
|
||||||
decomposed._float_bits.mantissa = 0;
|
decomposed.zero_mantissa();
|
||||||
}else if(exp_7b > BitsCvt::C2){
|
}else if(exp_7b > BitsCvt::C2){
|
||||||
exp_7b = BitsCvt::C2 + 1; // 64 + 63 = 127
|
exp_7b = BitsCvt::C2 + 1; // 64 + 63 = 127
|
||||||
if(!std::isnan(val)) decomposed._float_bits.mantissa = 0;
|
if(!std::isnan(val)) decomposed.zero_mantissa();
|
||||||
}
|
}
|
||||||
decomposed._float_bits.exp = exp_7b + BitsCvt::C2;
|
decomposed.set_exp(exp_7b + BitsCvt::C2);
|
||||||
|
// decomposed.print();
|
||||||
decomposed._int = (decomposed._int << 1) | 0b01;
|
decomposed._int = (decomposed._int << 1) | 0b01;
|
||||||
|
// decomposed.print();
|
||||||
return reinterpret_cast<PyObject*>(decomposed._int);
|
return reinterpret_cast<PyObject*>(decomposed._int);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline f64 untag_float(PyObject* val){
|
inline f64 untag_float(PyObject* val){
|
||||||
BitsCvt decomposed(reinterpret_cast<Number::int_t>(val));
|
BitsCvt decomposed(reinterpret_cast<Number::int_t>(val));
|
||||||
decomposed._int = (decomposed._int >> 1) & BitsCvt::C3;
|
decomposed._int = (decomposed._int >> 1) & BitsCvt::C3;
|
||||||
unsigned int exp_7b = decomposed._float_bits.exp;
|
unsigned int exp_7b = decomposed.exp();
|
||||||
if(exp_7b == 0) return 0.0f;
|
if(exp_7b == 0) return 0.0f;
|
||||||
if(exp_7b == BitsCvt::C0){
|
if(exp_7b == BitsCvt::C0){
|
||||||
decomposed._float_bits.exp = -1;
|
decomposed.set_exp(-1);
|
||||||
return decomposed._float;
|
return decomposed._float;
|
||||||
}
|
}
|
||||||
decomposed._float_bits.exp = exp_7b - BitsCvt::C2 + BitsCvt::C0;
|
decomposed.set_exp(exp_7b - BitsCvt::C2 + BitsCvt::C0);
|
||||||
return decomposed._float;
|
return decomposed._float;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user