floatutil.h

来自「傅立叶变换和小波变换是图像压缩的重要工具。该代大戏是利用小波变换进行图像压缩。」· C头文件 代码 · 共 175 行

H
175
字号
#ifndef CRBLIB_FLOATUTIL_H
#define CRBLIB_FLOATUTIL_H

//--------------------------------------------------------------------

#include <crblib/inc.h>

#pragma warning (disable:4514)	// unreferenced inline function

#define	PI											((float)3.14159265358979323846f)
#define	TWOPI										((float)6.28318530717958647692f)
#define	HALFPI										((float)1.57079632679489661923f)

#define DEGS_PER_RAD								((float)0.01745329251994329576f)
#define RADS_PER_DEG								((float)57.2957795130823208767f)

// should probably be moved to trig module
INLINE float fDegToRad(float d)
{
	return d * DEGS_PER_RAD;
}

INLINE float fRadToDeg(float r)
{
	return r * RADS_PER_DEG;
}

#define EPSILON										((float)0.000797f)
#define FLOATS_EQUAL(x,y)							( ABS((x) - (y)) < EPSILON )
#define FLOAT_ISZERO(x)								( ABS(x) < EPSILON )

#ifndef M_LOG2_E
#define M_LOG2_E  (0.693147180559945309417f)
#endif

#ifndef LN2
#define LN2 M_LOG2_E
#endif

#ifndef LN2inverse
#define LN2inverse (1.442695f)
#endif

#ifndef log2
#define log2(val) (log(val)*LN2inverse)
#endif

#define MSE2PSNR(mse)	((float)( 48.165 - 10.0*log10(mse)))
#define PSNR2MSE(psnr)	((float)pow(10.0,4.8165 - (psnr)*0.1))

INLINE float fSquare(float a)
{
	return a * a;
}

INLINE float fCube(float a)
{
	return a * a * a;
}

//------------------------------

#define ftoi	fToInt

float INLINE fRoundToInt(float val) // rounds depending on how you set geCPU_FloatControl
{
	__asm
	{
		FLD  val
		FRNDINT
		FSTP val
	}
return val;
}

float INLINE fSqrt(float val)
{
	__asm 
	{
		FLD  val		// 1 clock
		FSQRT			// 30-70 clocks
		FSTP val		// 2 clocks
	}
return val;
}

float INLINE fSin(float val)
{
	__asm 
	{
		FLD  val		// 1 clock
		FSIN			// ~ 200 clocks
		FSTP val		// 2 clocks
	}
return val;
}

float INLINE fCos(float val)
{
	__asm 
	{
		FLD  val		// 1 clock
		FCOS			// ~ 200 clocks
		FSTP val		// 2 clocks
	}
return val;
}

int INLINE fToInt(float f)
{
int i;
	__asm
	{
		FLD   f
		FISTP i
	}
return i;
}

#ifdef ftoi
#undef ftoi
#endif

#define ftoi fToInt

float INLINE itof(int i)
{
float f;
	__asm
	{
		FILD i
		FSTP f
	}
return f;
}

uint INLINE ilog2ceil(uint val)
{
	__asm
	{
		FILD val
		FSTP val
		mov eax,val
		add eax,0x7FFFFF // 1<<23 - 1
		shr eax,23
		sub eax,127
	}
}

uint INLINE ilog2floor(uint val)
{
	__asm
	{
		FILD val
		FSTP val
		mov eax,val
		shr eax,23
		sub eax,127
	}
}

uint INLINE flog2(float xf) // !!! 
{
return ((*(int*)&xf) >> 23) - 127;
}

void float_RoundToZero(void);
void float_SinglePrecision(void);
bool float_DoesRoundToZero(void);


#endif // CRBLIB_FLOATUTIL_H


⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?