feat: improved fastmath perf

This commit is contained in:
2025-12-22 13:22:56 +01:00
parent 45f300459d
commit a43149ec90

View File

@@ -26,62 +26,57 @@ struct decimal {
constexpr decimal(double i) : i(TO_INT(i)) {} constexpr decimal(double i) : i(TO_INT(i)) {}
constexpr decimal(int32_t i) : i(i) {} constexpr decimal(int32_t i) : i(i) {}
friend std::ostream &operator<<(std::ostream &os, const decimal &d) { inline friend std::ostream &operator<<(std::ostream &os, const decimal &d) {
return (os << TO_FLOAT(d.i)); return (os << TO_FLOAT(d.i));
} }
friend decimal operator+(const decimal &d1, const decimal &d2) { inline friend decimal operator+(const decimal &d1, const decimal &d2) {
return {d1.i + d2.i}; return {d1.i + d2.i};
} }
decimal &operator+=(const decimal &d) { return (*this) = {i + d.i}; } inline decimal &operator+=(const decimal &d) { return (*this) = {i + d.i}; }
friend decimal operator-(const decimal &d1, const decimal &d2) { inline friend decimal operator-(const decimal &d1, const decimal &d2) {
return {d1.i - d2.i}; return {d1.i - d2.i};
} }
friend decimal operator-(const decimal &d) { return {-d.i}; } inline friend decimal operator-(const decimal &d) { return {-d.i}; }
friend decimal operator*(const decimal &d1, const decimal &d2) { inline friend decimal operator*(const decimal &d1, const decimal &d2) {
return {MUL_F(d1.i, d2.i)}; return {MUL_F(d1.i, d2.i)};
} }
decimal &operator*=(const decimal &d) { return (*this) = {MUL_F(i, d.i)}; } inline decimal &operator*=(const decimal &d) {
return (*this) = {MUL_F(i, d.i)};
}
friend decimal operator/(const decimal &d1, const decimal &d2) { inline friend decimal operator/(const decimal &d1, const decimal &d2) {
return {DIV_F(d1.i, d2.i)}; return {DIV_F(d1.i, d2.i)};
} }
friend bool operator<(const decimal &d1, const decimal &d2) { inline friend bool operator<(const decimal &d1, const decimal &d2) {
return d1.i < d2.i; return d1.i < d2.i;
} }
friend bool operator>(const decimal &d1, const decimal &d2) { inline friend bool operator>(const decimal &d1, const decimal &d2) {
return d1.i > d2.i; return d1.i > d2.i;
} }
friend bool operator<=(const decimal &d1, const decimal &d2) { inline friend bool operator<=(const decimal &d1, const decimal &d2) {
return d1.i <= d2.i; return d1.i <= d2.i;
} }
friend bool operator>=(const decimal &d1, const decimal &d2) { inline friend bool operator>=(const decimal &d1, const decimal &d2) {
return d1.i >= d2.i; return d1.i >= d2.i;
} }
friend bool operator==(const decimal &d1, const decimal &d2) { inline friend bool operator==(const decimal &d1, const decimal &d2) {
return d1.i == d2.i; return d1.i == d2.i;
} }
friend bool operator!=(const decimal &d1, const decimal &d2) { inline friend bool operator!=(const decimal &d1, const decimal &d2) {
return d1.i != d2.i; return d1.i != d2.i;
} }
decimal &operator=(decimal const &in) {
if (this != &in) {
std::destroy_at(this);
std::construct_at(this, in);
}
return *this;
}
decimal sqrt() { return {((int32_t)sqrtf(i)) << HALF_SHIFT}; } inline decimal sqrt() { return {((int32_t)sqrtf(i)) << HALF_SHIFT}; }
float to_float() { return TO_FLOAT(i); } inline float to_float() { return TO_FLOAT(i); }
bool isSmall() { return (abs(i) < (1 << (HALF_SHIFT - 1))); } inline bool isSmall() { return (abs(i) < (1 << (HALF_SHIFT - 1))); }
}; };
template <int n, class Dev> struct vec { template <int n, class Dev> struct vec {
@@ -165,10 +160,10 @@ template <int n, class Dev> struct vec {
return v * d; return v * d;
} }
decimal operator*(const vec<n, Dev> &vec) { friend decimal operator*(const vec<n, Dev> &v1, const vec<n, Dev> &v2) {
decimal res = {0}; decimal res = {0};
for (int i = 0; i < n; i++) { for (int i = 0; i < n; i++) {
res += vec.v[i] * v[i]; res += v1.v[i] * v2.v[i];
} }
return res; return res;
} }