From fdd228071a3112aeebda20766c7df3b20b8651aa Mon Sep 17 00:00:00 2001 From: chai Date: Thu, 2 Dec 2021 14:44:36 +0800 Subject: +Fix32 --- Client/Source/Phy2D/Common/Settings.h | 82 ++++++++++++++++++++++++++++++++--- 1 file changed, 76 insertions(+), 6 deletions(-) (limited to 'Client/Source/Phy2D/Common/Settings.h') diff --git a/Client/Source/Phy2D/Common/Settings.h b/Client/Source/Phy2D/Common/Settings.h index 5c24b57..318a76c 100644 --- a/Client/Source/Phy2D/Common/Settings.h +++ b/Client/Source/Phy2D/Common/Settings.h @@ -1,27 +1,97 @@ #pragma once +#define NUMBER_FLOAT 1 +#define NUMBER_LIBFIX 2 +#define NUMBER_FPM 3 + +#define NUMBER_ALIAS NUMBER_FPM + +#if NUMBER_ALIAS == NUMBER_LIBFIX #include "libfixmath/libfixmath/fixmath.h" +#elif NUMBER_ALIAS == NUMBER_FPM +#include "fpm/include/fpm/fixed.hpp" +#include "fpm/include/fpm/math.hpp" +#endif namespace Phy2D { -#define NUMBER_FLOAT false +#if NUMBER_ALIAS == NUMBER_FLOAT -#if NUMBER_FLOAT -typedef float number; + typedef float fixed; #define NUMBER_MAX (FLT_MAX) #define NUMBER_MIN (FLT_MIN) #define SQRT(a) (sqrt((a))) #define SIN(a) (sin((a))) #define COS(a) (cos((a))) -#else -// 同时一定要开启内联函数扩展,否则执行效率会非常低 -typedef Fix16 number; +#define PI (3.1415925f) + +#elif NUMBER_ALIAS == NUMBER_LIBFIX + + // 同时一定要开启内联函数扩展,否则执行效率会非常低 + typedef Fix16 fixed; #define NUMBER_MAX (fix16_maximum) #define NUMBER_MIN (fix16_minimum) #define SQRT(a) ((a).sqrt()) #define SIN(a) ((a).sin()) #define COS(a) ((a).cos()) +#define PI (fix16_pi) + +#elif NUMBER_ALIAS == NUMBER_FPM + + template + struct Limits {}; + + template <> + struct Limits + { + static constexpr bool is_signed() noexcept { return true; } + static constexpr int digits() noexcept { return 31; } + static constexpr int max_digits10() noexcept { return 5 + 5; } + static constexpr int min_exponent() noexcept { return -15; } + static constexpr int max_exponent() noexcept { return 15; } + static constexpr int min_exponent10() noexcept { return -4; } + static constexpr int max_exponent10() noexcept { return 4; } + static constexpr fpm::fixed_16_16 min() noexcept { return fpm::fixed_16_16::from_raw_value(-2147483647 - 1); } + static constexpr fpm::fixed_16_16 max() noexcept { return fpm::fixed_16_16::from_raw_value(2147483647); } + }; + + template <> + struct Limits + { + static constexpr bool is_signed() noexcept { return true; } + static constexpr int digits() noexcept { return 31; } + static constexpr int max_digits10() noexcept { return 7 + 3; } + static constexpr int min_exponent() noexcept { return -7; } + static constexpr int max_exponent() noexcept { return 23; } + static constexpr int min_exponent10() noexcept { return -2; } + static constexpr int max_exponent10() noexcept { return 6; } + static constexpr fpm::fixed_24_8 min() noexcept { return fpm::fixed_24_8::from_raw_value(-2147483647 - 1); } + static constexpr fpm::fixed_24_8 max() noexcept { return fpm::fixed_24_8::from_raw_value(2147483647); } + }; + + template <> + struct Limits + { + static constexpr bool is_signed() noexcept { return true; } + static constexpr int digits() noexcept { return 31; } + static constexpr int max_digits10() noexcept { return 3 + 8; } + static constexpr int min_exponent() noexcept { return -23; } + static constexpr int max_exponent() noexcept { return 7; } + static constexpr int min_exponent10() noexcept { return -7; } + static constexpr int max_exponent10() noexcept { return 2; } + static constexpr fpm::fixed_8_24 min() noexcept { return fpm::fixed_8_24::from_raw_value(-2147483647 - 1); } + static constexpr fpm::fixed_8_24 max() noexcept { return fpm::fixed_8_24::from_raw_value(2147483647); } + }; + + typedef fpm::fixed_16_16 fixed; +#define NUMBER_MAX (Limits::max()) +#define NUMBER_MIN (Limits::min()) +#define SQRT(a) (fpm::sqrt((a))) +#define SIN(a) (fpm::sin((a))) +#define COS(a) (fpm::cos((a))) +#define PI (fixed::pi()) + #endif } \ No newline at end of file -- cgit v1.1-26-g67d0