18 #ifndef INCLUDED_FIXED 19 #define INCLUDED_FIXED 28 #define USE_FIXED_OVERFLOW_CHECKS 34 #define FIXED_MUL_I64_I32_I32(a, b) (__emul((a), (b))) 36 #define FIXED_MUL_I64_I32_I32(a, b) ((i64)(a) * (i64)(b)) 40 #ifndef USE_FIXED_OVERFLOW_CHECKS 42 #define CheckSignedSubtractionOverflow(type, left, right, overflowWarning, underflowWarning) 43 #define CheckSignedAdditionOverflow(type, left, right, overflowWarning, underflowWarning) 44 #define CheckCastOverflow(var, targetType, overflowWarning, underflowWarning) 45 #define CheckU32CastOverflow(var, targetType, overflowWarning) 46 #define CheckUnsignedAdditionOverflow(result, operand, overflowWarning) 47 #define CheckUnsignedSubtractionOverflow(result, operand, overflowWarning) 48 #define CheckNegationOverflow(var, type, overflowWarning) 49 #define CheckMultiplicationOverflow(type, left, right, overflowWarning, underflowWarning) 50 #define CheckDivisionOverflow(type, left, right, overflowWarning) 52 #else // USE_FIXED_OVERFLOW_CHECKS 54 #define CheckSignedSubtractionOverflow(type, left, right, overflowWarning, underflowWarning) \ 55 if(left > 0 && right < 0 && left > std::numeric_limits<type>::max() + right) \ 56 debug_warn(overflowWarning); \ 57 else if(left < 0 && right > 0 && left < std::numeric_limits<type>::min() + right) \ 58 debug_warn(underflowWarning); 60 #define CheckSignedAdditionOverflow(type, left, right, overflowWarning, underflowWarning) \ 61 if(left > 0 && right > 0 && std::numeric_limits<type>::max() - left < right) \ 62 debug_warn(overflowWarning); \ 63 else if(left < 0 && right < 0 && std::numeric_limits<type>::min() - left > right) \ 64 debug_warn(underflowWarning); 66 #define CheckCastOverflow(var, targetType, overflowWarning, underflowWarning) \ 67 if(var > std::numeric_limits<targetType>::max()) \ 68 debug_warn(overflowWarning); \ 69 else if(var < std::numeric_limits<targetType>::min()) \ 70 debug_warn(underflowWarning); 72 #define CheckU32CastOverflow(var, targetType, overflowWarning) \ 73 if(var > (u32)std::numeric_limits<targetType>::max()) \ 74 debug_warn(overflowWarning); 76 #define CheckUnsignedAdditionOverflow(result, operand, overflowWarning) \ 77 if(result < operand) \ 78 debug_warn(overflowWarning); 80 #define CheckUnsignedSubtractionOverflow(result, left, overflowWarning) \ 82 debug_warn(overflowWarning); 84 #define CheckNegationOverflow(var, type, overflowWarning) \ 85 if(value == std::numeric_limits<type>::min()) \ 86 debug_warn(overflowWarning); 88 #define CheckMultiplicationOverflow(type, left, right, overflowWarning, underflowWarning) \ 89 i64 res##left = (i64)left * (i64)right; \ 90 CheckCastOverflow(res##left, type, overflowWarning, underflowWarning) 92 #define CheckDivisionOverflow(type, left, right, overflowWarning) \ 93 if(right == -1) { CheckNegationOverflow(left, type, overflowWarning) } 95 #endif // USE_FIXED_OVERFLOW_CHECKS 100 return (
T)(value >= 0 ? value + 0.5f : value - 0.5f);
103 template <
typename T>
106 return (
T)(value >= 0 ? value + 0.5 : value - 0.5);
114 template<
typename T, T max_t,
int total_bits,
int int_bits,
int fract_bits_,
int fract_pow2>
145 float scaled = n * fract_pow2;
146 return CFixed(round_away_from_zero<T>(scaled));
153 double scaled = n * fract_pow2;
154 return CFixed(round_away_from_zero<T>(scaled));
163 return (
float)value / (float)fract_pow2;
169 return value / (double)fract_pow2;
177 return (value + fract_pow2 - 1) >>
fract_bits;
182 return (value + fract_pow2 - 1) >>
fract_bits;
199 bool IsZero()
const {
return value == 0; }
251 return CFixed(value >> n);
258 return CFixed(value << n);
267 CheckCastOverflow(result,
T, L
"Overflow in CFixed::operator/(CFixed n)", L
"Underflow in CFixed::operator/(CFixed n)")
282 t = std::max((
i64)std::numeric_limits<T>::min(), std::min((
i64)std::numeric_limits<T>::max(), t));
297 if (n.
value > 0 && t < 0)
299 else if (n.
value < 0 && t > 0)
316 CheckCastOverflow(t,
T, L
"Overflow in CFixed::Multiply(CFixed n)", L
"Underflow in CFixed::Multiply(CFixed n)")
334 CheckCastOverflow(t,
T, L
"Overflow in CFixed::Multiply(CFixed n)", L
"Underflow in CFixed::Multiply(CFixed n)")
367 template<
typename T, T max_t,
int total_bits,
int int_bits,
int fract_bits_,
int fract_pow2>
368 struct numeric_limits<
CFixed<
T, max_t, total_bits, int_bits, fract_bits_, fract_pow2> >
372 static const bool is_specialized =
true;
390 #endif // INCLUDED_FIXED CFixed< T, max_t, total_bits, int_bits, fract_bits_, fract_pow2 > fixed
Definition: Fixed.h:370
A simple fixed-point number class.
Definition: Fixed.h:115
int64_t i64
Definition: types.h:35
bool operator>(CFixed n) const
Numeric comparison.
Definition: Fixed.h:217
CFixed()
Definition: Fixed.h:125
#define FIXED_MUL_I64_I32_I32(a, b)
Definition: Fixed.h:36
static CFixed Zero()
Definition: Fixed.h:127
CFixed_15_16 fixed
Default fixed-point type used by the engine.
Definition: Fixed.h:360
#define isfinite
Definition: posix.h:127
CFixed operator>>(int n) const
Definition: Fixed.h:248
CFixed Absolute() const
Definition: Fixed.h:305
CFixed operator-() const
Negate a CFixed.
Definition: Fixed.h:242
CFixed & operator+=(CFixed n)
Add a CFixed. Might overflow.
Definition: Fixed.h:236
Definition: unique_range.h:196
CFixed operator+(CFixed n) const
Add a CFixed. Might overflow.
Definition: Fixed.h:222
CFixed & operator-=(CFixed n)
Subtract a CFixed. Might overflow.
Definition: Fixed.h:239
#define ASSERT(expr)
same as ENSURE in debug mode, does nothing in release mode.
Definition: debug.h:315
T GetInternalValue() const
Definition: Fixed.h:131
static CFixed Pi()
Definition: Fixed.cpp:182
#define CheckSignedSubtractionOverflow(type, left, right, overflowWarning, underflowWarning)
Definition: Fixed.h:54
CFixed operator%(CFixed n) const
Mod by a fixed. Must not have n == 0. Result has the same sign as n.
Definition: Fixed.h:294
int ToInt_RoundToZero() const
Definition: Fixed.h:172
uint64_t u64
Definition: types.h:40
void SetInternalValue(T n)
Definition: Fixed.h:132
CFixed< i32,(i32) 0x7fffffff, 32, 15, 16, 65536 > CFixed_15_16
A fixed-point number class with 1-bit sign, 15-bit integral part, 16-bit fractional part...
Definition: Fixed.h:355
CFixed operator/(int n) const
Divide by an integer. Must not have n == 0. Cannot overflow unless n == -1.
Definition: Fixed.h:287
CFixed(T v)
Definition: Fixed.h:120
uint32_t u32
Definition: types.h:39
T round_away_from_zero(float value)
Definition: Fixed.h:98
CFixed Sqrt() const
Definition: Fixed.h:338
CFixed Multiply(CFixed n) const
Multiply by a CFixed.
Definition: Fixed.h:311
float ToFloat() const
Convert to float. May be lossy - float can't represent all values.
Definition: Fixed.h:161
static CFixed Epsilon()
Definition: Fixed.h:128
#define CheckNegationOverflow(var, type, overflowWarning)
Definition: Fixed.h:84
u32 isqrt64(u64 n)
64-bit integer square root.
Definition: Sqrt.cpp:23
static fixed min()
Definition: Fixed.h:373
bool operator>=(CFixed n) const
Numeric comparison.
Definition: Fixed.h:214
static CFixed FromString(const CStr8 &s)
Definition: Fixed.cpp:27
#define CheckDivisionOverflow(type, left, right, overflowWarning)
Definition: Fixed.h:92
#define T(string_literal)
Definition: secure_crt.cpp:76
CFixed operator*(int n) const
Multiply by an integer. Might overflow.
Definition: Fixed.h:272
int ToInt_RoundToNegInfinity() const
Definition: Fixed.h:185
T value
Definition: Fixed.h:118
double ToDouble() const
Convert to double. Won't be lossy - double can precisely represent all values.
Definition: Fixed.h:167
#define CheckSignedAdditionOverflow(type, left, right, overflowWarning, underflowWarning)
Definition: Fixed.h:60
CFixed MulDiv(CFixed m, CFixed d) const
Compute this*m/d.
Definition: Fixed.h:331
int32_t i32
Definition: types.h:34
static CFixed FromInt(int n)
Definition: Fixed.h:136
static fixed max()
Definition: Fixed.h:374
CFixed operator-(CFixed n) const
Subtract a CFixed. Might overflow.
Definition: Fixed.h:229
CFixed operator<<(int n) const
Definition: Fixed.h:254
bool IsZero() const
Returns true if the number is precisely 0.
Definition: Fixed.h:199
bool operator<(CFixed n) const
Numeric comparison.
Definition: Fixed.h:211
void sincos_approx(CFixed_15_16 a, CFixed_15_16 &sin_out, CFixed_15_16 &cos_out)
Compute sin(a) and cos(a).
Definition: Fixed.cpp:187
CStr8 ToString() const
Returns the shortest string such that FromString will parse to the correct value. ...
Definition: Fixed.cpp:96
#define CheckMultiplicationOverflow(type, left, right, overflowWarning, underflowWarning)
Definition: Fixed.h:88
bool operator!=(CFixed n) const
Inequality.
Definition: Fixed.h:205
bool operator<=(CFixed n) const
Numeric comparison.
Definition: Fixed.h:208
static CFixed FromFloat(float n)
Definition: Fixed.h:141
CFixed Square() const
Multiply the value by itself.
Definition: Fixed.h:323
CFixed operator/(CFixed n) const
Divide by a CFixed. Must not have n.IsZero(). Might overflow.
Definition: Fixed.h:262
int ToInt_RoundToNearest() const
Definition: Fixed.h:190
CFixed MultiplyClamp(int n) const
Multiply by an integer. Avoids overflow by clamping to min/max representable value.
Definition: Fixed.h:279
bool operator==(CFixed n) const
Equality.
Definition: Fixed.h:202
static CFixed FromDouble(double n)
Definition: Fixed.h:149
int ToInt_RoundToInfinity() const
Definition: Fixed.h:180
CFixed_15_16 atan2_approx(CFixed_15_16 y, CFixed_15_16 x)
Inaccurate approximation of atan2 over fixed-point numbers.
Definition: Fixed.cpp:147
#define CheckCastOverflow(var, targetType, overflowWarning, underflowWarning)
Definition: Fixed.h:66