⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 extended.cpp

📁 编译类_Hss VC版_源代码支持表达式的编译执行,速度超快,支持实数和复数,并附带一个复数函数库你还可以同时找到VB和VC版和Delphi版
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		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 + -