double _pow(double x, double y)
{
/*
| 【概要】
| 累乗を求める
| 【引数】
| x : 元
| y : 指数
| 【戻り値】
| xのy乗を返す. x と y の値が無効な場合は 0.0 を返す.
*/
int itmp;
double dtmp;
__asm {
// flg=0;
xor edx, edx
;
; if(x==0.0) { // ゼロのy乗でエラー
;
fld x
ftst
fnstsw ax
sahf
jnz jp1
;
; if(y==0.0)
; return 1.0;
; else
; return 0.0;
;
fld y
ftst
fnstsw ax
sahf
fldz
jnz Rtn
fld1
jmp Rtn
;
; }
;
jp1:
;
; if(x<0.0) {
; x=-x;
;
jae jp2
fchs
;
; if(y==(double)((int)y))
;
fld y
frndint
fcom y
fnstsw ax
sahf
jne err
;
; // フラグセット
; flg=(int)y&1;
;
fistp itmp
mov edx, itmp
and edx, 1
jmp jp2
;
; // 負の数のy乗(小数点あり)でエラー
; else
; return 0.0;
;
err:
fldz
jmp Rtn
;
; }
;
jp2:
;
; if(flg)
; else
;
fld y
fxch
fyl2x ; log2x^y=m+n m:整数部, n:小数部
fst dtmp
frndint
fld dtmp
fsub st(0), st(1)
fstp dtmp ; dtmp=n, st(0)=n
fld1
fscale
fld dtmp
f2xm1
fld1
fadd st(0), st(1)
fmul st(0), st(2) ; x^y=(x^m)*(x^n)
test edx, edx
jz Rtn
fchs
Rtn:
}
}
最終更新:2008年05月31日 20:05