mirror of
https://github.com/ACreTeam/ac-decomp
synced 2026-05-23 06:34:18 -04:00
92 lines
2.1 KiB
C
92 lines
2.1 KiB
C
#ifndef _MSL_COMMON_FLOAT_H
|
|
#define _MSL_COMMON_FLOAT_H
|
|
|
|
#include "MSL_C/MSL_Common_Embedded/Math/fdlibm.h"
|
|
|
|
#define FP_SNAN 0
|
|
#define FP_QNAN 1
|
|
#define FP_INFINITE 2
|
|
#define FP_ZERO 3
|
|
#define FP_NORMAL 4
|
|
#define FP_SUBNORMAL 5
|
|
|
|
#define FP_NAN FP_QNAN
|
|
|
|
#define fpclassify(x) \
|
|
((sizeof(x) == sizeof(float)) ? __fpclassifyf(x) : __fpclassifyd(x))
|
|
#define signbit(x) \
|
|
((sizeof(x) == sizeof(float)) ? __signbitf(x) : __signbitd(x))
|
|
#define isfinite(x) ((fpclassify(x) > 2))
|
|
#define isnan(x) ((fpclassify(x) == FP_NAN))
|
|
#define isinf(x) ((fpclassify(x) == FP_INFINITE))
|
|
|
|
#define __signbitf(x) ((int)(__HI(x) & 0x80000000))
|
|
|
|
// TODO: OK?
|
|
#define __signbitd(x) ((int)(__HI(x) & 0x80000000))
|
|
|
|
extern unsigned long __float_nan[];
|
|
extern unsigned long __float_huge[];
|
|
extern unsigned long __float_max[];
|
|
extern unsigned long __float_epsilon[];
|
|
|
|
inline int __fpclassifyf(float __value)
|
|
{
|
|
unsigned long integer = *(unsigned long*)&__value;
|
|
|
|
switch (integer & 0x7f800000) {
|
|
case 0x7f800000:
|
|
if ((integer & 0x7fffff) != 0) {
|
|
return FP_QNAN;
|
|
}
|
|
return FP_INFINITE;
|
|
|
|
case 0:
|
|
if ((integer & 0x7fffff) != 0) {
|
|
return FP_SUBNORMAL;
|
|
}
|
|
return FP_ZERO;
|
|
}
|
|
|
|
return FP_NORMAL;
|
|
}
|
|
|
|
inline int __fpclassifyd(double __value)
|
|
{
|
|
switch (__HI(__value) & 0x7ff00000) {
|
|
case 0x7ff00000: {
|
|
if ((__HI(__value) & 0x000fffff) || (__LO(__value) & 0xffffffff))
|
|
return FP_QNAN;
|
|
else
|
|
return FP_INFINITE;
|
|
break;
|
|
}
|
|
case 0: {
|
|
if ((__HI(__value) & 0x000fffff) || (__LO(__value) & 0xffffffff))
|
|
return FP_SUBNORMAL;
|
|
else
|
|
return FP_ZERO;
|
|
break;
|
|
}
|
|
}
|
|
return FP_NORMAL;
|
|
}
|
|
|
|
#define FLT_MANT_DIG 24
|
|
#define FLT_DIG 6
|
|
#define FLT_MIN_EXP (-125)
|
|
#define FLT_MIN_10_EXP (-37)
|
|
#define FLT_MAX_EXP 128
|
|
#define FLT_MAX_10_EXP 38
|
|
|
|
//#define FLT_MAX 3.40282346638528860e+38f
|
|
#define FLT_EPSILON 1.1920928955078125e-07f
|
|
|
|
#define DBL_MANT_DIG 53
|
|
#define DBL_DIG 15
|
|
#define DBL_MIN_EXP (-1021)
|
|
#define DBL_MIN_10_EXP (-308)
|
|
#define DBL_MAX_EXP 1024
|
|
#define DBL_MAX_10_EXP 308
|
|
|
|
#endif /* _MSL_COMMON_FLOAT_H */ |