Looking in “GenericPlatformMath.h”, just like in so many other places in Unreal Engine’s (8 million lines?) code base, I found pages of the following. My question is, where does this strange (and harmful) practice come from, and who’s paid to do that?
static CORE_API FORCENOINLINE float Fmod(float X, float Y);
static CORE_API FORCENOINLINE double Fmod(double X, double Y);
RESOLVE_FLOAT_AMBIGUITY_2_ARGS(Fmod);
static FORCEINLINE float Sin( float Value ) { return sinf(Value); }
static FORCEINLINE double Sin( double Value ) { return sin(Value); }
static FORCEINLINE float Asin( float Value ) { return asinf( (Value<-1.f) ? -1.f : ((Value<1.f) ? Value : 1.f) ); }
static FORCEINLINE double Asin( double Value ) { return asin( (Value<-1.0) ? -1.0 : ((Value<1.0) ? Value : 1.0) ); }
static FORCEINLINE float Sinh(float Value) { return sinhf(Value); }
static FORCEINLINE double Sinh(double Value) { return sinh(Value); }
static FORCEINLINE float Cos( float Value ) { return cosf(Value); }
static FORCEINLINE double Cos( double Value ) { return cos(Value); }
static FORCEINLINE float Acos( float Value ) { return acosf( (Value<-1.f) ? -1.f : ((Value<1.f) ? Value : 1.f) ); }
static FORCEINLINE double Acos( double Value ) { return acos( (Value<-1.0) ? -1.0 : ((Value<1.0) ? Value : 1.0) ); }
static FORCEINLINE float Cosh(float Value) { return coshf(Value); }
static FORCEINLINE double Cosh(double Value) { return cosh(Value); }
static FORCEINLINE float Tan( float Value ) { return tanf(Value); }
static FORCEINLINE double Tan( double Value ) { return tan(Value); }
static FORCEINLINE float Atan( float Value ) { return atanf(Value); }
static FORCEINLINE double Atan( double Value ) { return atan(Value); }
static FORCEINLINE float Tanh(float Value) { return tanhf(Value); }
static FORCEINLINE double Tanh(double Value) { return tanh(Value); }
static CORE_API float Atan2( float Y, float X );
static CORE_API double Atan2( double Y, double X );
RESOLVE_FLOAT_AMBIGUITY_2_ARGS(Atan2);
static FORCEINLINE float Sqrt( float Value ) { return sqrtf(Value); }
static FORCEINLINE double Sqrt( double Value ) { return sqrt(Value); }
static FORCEINLINE float Pow( float A, float B ) { return powf(A,B); }
static FORCEINLINE double Pow( double A, double B ) { return pow(A,B); }
RESOLVE_FLOAT_AMBIGUITY_2_ARGS(Pow);
/** Computes a fully accurate inverse square root */
static FORCEINLINE float InvSqrt( float F ) { return 1.0f / sqrtf( F ); }
static FORCEINLINE double InvSqrt( double F ) { return 1.0 / sqrt( F ); }
/** Computes a faster but less accurate inverse square root */
static FORCEINLINE float InvSqrtEst( float F ) { return InvSqrt( F ); }
static FORCEINLINE double InvSqrtEst( double F ) { return InvSqrt( F ); }