📄 extended.cpp
字号:
Fpatan
fstp _ExFloatPtr [_reg_this]
}
}
void Extended::ArcTan2 (const Extended & y) //反正切2 (-PI~PI) 相当于this=Arctan(y/this),但不全部等价,
//求出的值是真正的全角度,数学运算中很有用!
{
__asm
{
mov eax,[y]
fld _ExFloatPtr [eax]
FLD _ExFloatPtr [_reg_this]
FPATAN
fstp _ExFloatPtr [_reg_this]
}
}
void Extended::Csc () //余割 1/Sin(this)
{
__asm
{
fld _ExFloatPtr [_reg_this]
fsin
fld1
fdivrp st(1),st
fstp _ExFloatPtr [_reg_this]
}
}
void Extended::Sec () //正割 1/Cos(this)
{
__asm
{
fld _ExFloatPtr [_reg_this]
fcos
fld1
fdivrp st(1),st
fstp _ExFloatPtr [_reg_this]
}
}
void Extended::Cot () //余切 1/Tan(this)
{
__asm
{
fld _ExFloatPtr [_reg_this]
fptan
fdivrp st(1),st
fstp _ExFloatPtr [_reg_this]
}
}
void Extended::ArcCsc () //反余割
{
__asm
{
fld _ExFloatPtr [_reg_this]
fld1
fdivrp st(1),st
FST st(1)
Fmul st,st(1)
fld1
Fsubr
Fsqrt
Fpatan
fstp _ExFloatPtr [_reg_this]
}
}
void Extended::ArcSec () //反正割
{
__asm
{
fld _ExFloatPtr [_reg_this]
fld1
fdivrp st(1),st
FST st(1)
Fmul st,st(0)
fld1
Fsubr
Fsqrt
Fxch
Fpatan
fstp _ExFloatPtr [_reg_this]
}
}
void Extended::ArcCot () //反余切
{
__asm
{
fld _ExFloatPtr [_reg_this]
fld1
fdivrp st(1),st
Fld1
Fpatan
fstp _ExFloatPtr [_reg_this]
}
}
void Extended::SinH () //双曲正弦
{
__asm
{
fld _ExFloatPtr [_reg_this]
FLDL2E
FMULp st(1),st
FLD ST(0)
FRNDINT
FSUB ST(1), ST
FXCH ST(1)
F2XM1
FLD1
FADDp st(1),st
FSCALE
FSTP ST(1)
fld1
fdiv st,st(1)
fsubp st(1),st
fld _tempHalf
fmulp st(1),st
fstp _ExFloatPtr [_reg_this]
}
}
void Extended::CosH () //双曲余弦
{
__asm
{
fld _ExFloatPtr [_reg_this]
FLDL2E
FMULp st(1),st
FLD ST(0)
FRNDINT
FSUB ST(1), ST
FXCH ST(1)
F2XM1
FLD1
FADDp st(1),st
FSCALE
FSTP ST(1)
fld1
fdiv st,st(1)
faddp st(1),st
fld _tempHalf
fmulp st(1),st
fstp _ExFloatPtr [_reg_this]
}
}
void Extended::TanH () //双曲正切
{
__asm
{
fld _ExFloatPtr [_reg_this]
//if1:
fst st(1)
fld _tempMaxTanhDomain // _tempMaxTanhDomain -> st
fcompp
fstsw ax
sahf
jnb if2 // jmp if _tempMaxTanhDomain > x
fld1
jmp end
if2: fst st(1)
fld _tempMaxTanhDomain // _tempMaxTanhDomain -> st
fchs
fcompp
fstsw ax
sahf
jbe else
fld1
fchs
jmp end
else:
FLDL2E //st:=EXP(st)
FMULp st(1),st
FLD ST(0)
FRNDINT
FSUB ST(1), ST
FXCH ST(1)
F2XM1
FLD1
FADDp st(1),st
FSCALE
FSTP ST(1)
fmul st(0),st
fst st(1)
fld1
fsubp st(1),st //st(1):=st(1)-st , pop
fxch
fld1
faddp st(1),st //st(1):=st(1)+st, pop
fdivp st(1),st //st(1):=st(1)/st ,pop
end:
fstp _ExFloatPtr [_reg_this]
}
}
void Extended::SinHCosH(Extended * xSinH,Extended * xCosH)const //同时求出双曲正弦和双曲余弦,并通过参数传出,this值不变,
//该函数的计算时间只相当于求一次SinH(或CosH)的时间!!!
{
__asm
{
fld _ExFloatPtr [_reg_this]
FLDL2E
FMULp st(1),st
FLD ST(0)
FRNDINT
FSUB ST(1), ST
FXCH ST(1)
F2XM1
FLD1
FADDp st(1),st
FSCALE
FSTP ST(1)
fld _tempHalf
fmulp st(1),st
fld _tempHalfHalf
fxch st(1)
fdiv st(1),st
fld st(0)
mov eax,[xSinH]
fsub st,st(2)
fstp _ExFloatPtr [eax]
mov eax,[xCosH]
faddp st(1),st
fstp _ExFloatPtr [eax]
}
}
void Extended::ArcSinH () //双曲反正弦
{
const long double Maxx = 1.0e10;
__asm
{
fld _ExFloatPtr [_reg_this]
//if1:
fst st(1)
fldz
fcompp
fstsw ax
sahf
jnz else1
fldz
jmp exitend
else1: fst st(1)
fstp _ExFloatPtr [ebp-16]
fabs
//if21:
fst st(1)
fld Maxx
fcompp
fstsw ax
sahf
jae else2
fadd st,st(0)
fldln2 // Ln(2) -> st : st-> st(1)
fxch // st <-> st(1)
fyl2x // st(1)*Log2(st) -> st
jmp exit2
else2: fst st(2)
fmul st,st(0)
fst st(1)
fld1
faddp st(1),st
fsqrt
fld1
faddp st(1),st
fdivp st(1),st
faddp st(1),st
fld1
faddp st(1),st
fldln2 // Ln(2) -> st : st-> st(1)
fxch // st <-> st(1)
fyl2x // st(1)*Log2(st) -> st
exit2: fld _ExFloatPtr [ebp-16]
fldz
fcompp
fstsw ax
sahf
jbe exitend
fchs
exitend:
fstp _ExFloatPtr [_reg_this]
}
}
void Extended::ArcCosH () //双曲反余弦
{
const long double Maxx = 1.0e10;
__asm
{
fld _ExFloatPtr [_reg_this]
//if1:
fst st(1)
fld1
fcompp
fstsw ax
sahf
jb if2 // jmp if 1 < x
fldz
jmp end
if2: fst st(1)
fld Maxx
fcompp
fstsw ax
sahf
jnb else
fadd st,st(0)
fldln2 // Ln(2) -> st : st-> st(1)
fxch // st <-> st(1)
fyl2x // st(1)*Log2(st) -> st
jmp end
else: fst st(1)
fmul st,st(0)
fld1
fsubp st(1),st //st(1):=st(1)-st , pop
fsqrt //st^0.5-> st
faddp st(1),st
fldln2 // Ln(2) -> st : st-> st(1)
fxch // st <-> st(1)
fyl2x // st(1)*Log2(st) -> st
end:
fstp _ExFloatPtr [_reg_this]
}
}
void Extended::ArcTanH () //双曲反正切
{
Extended temp;
__asm
{
fld _ExFloatPtr [_reg_this]
//if1:
fst st(1)
fldz
fcompp
fstsw ax
sahf
jnz else1
fldz
jmp end
else1: fst st(1)
fstp _ExFloatPtr temp
fabs
//if21:
fst st(1)
fld1
fcompp
fstsw ax
sahf
ja else2
fld _tempMaxTanhDomain
jmp exit2
else2: fst st(1)
fld1
fsub st,st(1)
fxch st(1)
fadd st(0),st
fdiv st,st(1)
fld1
faddp st(1),st
fldln2 // Ln(2) -> st : st-> st(1)
fxch // st <-> st(1)
fyl2x // st(1)*Log2(st) -> st
fld1
fadd st(0),st
fdivp st(1),st
exit2: fld _ExFloatPtr temp
fldz
fcompp
fstsw ax
sahf
jbe end
fchs
end:
fstp _ExFloatPtr [_reg_this]
}
}
void Extended::CscH () //双曲余割 1/SinH(this)
{
this->SinH();
this->Rev();
}
void Extended::SecH () //双曲正割 1/CosH(this)
{
this->CosH();
this->Rev();
}
void Extended::CotH () //双曲余切 1/TanH(this)
{
this->TanH();
this->Rev();
}
void Extended::ArcCscH () //双曲反余割
{
__asm
{
fld _ExFloatPtr [_reg_this]
fld1
fdivrp st(1),st
fld st
fmul st(0),st
fld1
faddp st(1),st
fsqrt
faddp st(1),st
fldln2
fxch
fyl2x
fstp _ExFloatPtr [_reg_this]
}
}
void Extended::ArcSecH () //双曲反正割
{
__asm
{
fld _ExFloatPtr [_reg_this]
fld st
fmul st(0),st
fld1
fsubrp st(1),st
fsqrt
fld1
faddp st(1),st
fdivrp st(1),st
fldln2
fxch
fyl2x
fstp _ExFloatPtr [_reg_this]
}
}
void Extended::ArcCotH () //双曲反余切
{
__asm
{
fld _ExFloatPtr [_reg_this]
fld st
fld1
fsub st(2),st
faddp st(1),st
fdivrp st(1),st
fldln2
fxch
fyl2x
fld _tempHalf
fmulp st(1),st
fstp _ExFloatPtr [_reg_this]
}
}
void Extended::Fld_PI () //得到常量 圆周率 PI = 3.1415926535897932384626
{
__asm
{
fldpi
fstp _ExFloatPtr [_reg_this]
}
}
void Extended::Fld_e () //得到常量 自然数 e = 2.7182818284590452353603
{
__asm
{
mov DWORD Ptr [_reg_this],0xA2BB4A9B
mov DWORD Ptr [_reg_this+4],0xADF85458
mov WORD Ptr [_reg_this+8],0x4000
}
}
void Extended::Fld_1 () //得到常量 1.0
{
__asm
{
fld1
fstp _ExFloatPtr [_reg_this]
}
}
void Extended::Fld_0 () //得到常量 0.0
{
__asm
{
//fldz
//fstp _ExFloatPtr [_reg_this]
xor eax,eax
mov [_reg_this],eax
mov [_reg_this+4],eax
mov [_reg_this+8],ax
}
}
///////////////////////////////////////
BOOL _isnan ( const Extended& x )
{
//Extended re(x);
//void* xthis=&re;
const void* xthis=&x;
if ( (*(DWORD*)(DWORD(xthis)+4) & 0x80000000) == 0 )
{
if( (*(__int64*)(xthis)!=0) | (*(WORD*)(DWORD(xthis)+8)!=0) )
{
return TRUE; //错误格式 err
}
else
{
return FALSE; //正常数值 float==0
}
}
else if ( (*(DWORD*)(DWORD(xthis)+6) & 0x7FFF8000) == 0x7FFF8000 )
{
if (( *(__int64*)(xthis) & 0x7FFFFFFFFFFFFFFF) == 0 )
{
//if ( (*(WORD*)(DWORD(xthis)+8) & 0x8000) == 0x8000 )
// return FALSE; //负无穷大 -inf
// else
// return FALSE; //正无穷大 +inf
return FALSE; //无穷大 inf
}
else
{
return TRUE; //无意义 nan
}
}
else
{
return FALSE; //正常数值
}
}
BOOL _finite ( const Extended& x )
{
//Extended re(x);
//void* xthis=&re;
const void* xthis=&x;
if ( (*(DWORD*)(DWORD(xthis)+4) & 0x80000000) == 0 )
{
if( (*(__int64*)(xthis)!=0) | (*(WORD*)(DWORD(xthis)+8)!=0) )
{
return FALSE; //错误格式 err
}
else
{
return TRUE; //正常数值 float==0
}
}
else if ( (*(DWORD*)(DWORD(xthis)+6) & 0x7FFF8000) == 0x7FFF8000 )
{
/*
if ( *(__int64*)(xthis) & 0x7FFFFFFFFFFFFFFF == 0 )
{
//if ( (*(WORD*)(DWORD(xthis)+8) & 0x8000) == 0x8000 )
// return FALSE; //负无穷大 -inf
// else
// return FALSE; //正无穷大 +inf
return FALSE; //无穷大 inf
}
else
{
return FALSE; //无意义 nan
}
*/
return FALSE; // 无意义 nan 或 无穷大 inf
}
else
{
return TRUE; //正常数值
}
}
const Extended modf (const Extended& x, Extended *intptr )
{
*intptr=x;
intptr->Trunc();
Extended r(x);
r.Sub(*intptr);
return r;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -