I have a routine for calculate the x^y with C calls. It works fine with some numbers but with another ones it returns bad values. Some friend has said me that the problems is the range of one instruction (mybe log2?). Anyone can explain me how I can solve the problem? I have search in the forums and everywhere I find the same method to calculate x^y that I use.

_PowFPU PROC

Push BP

Mov BP, SP

Fld DWORD PTR

Fld DWORD PTR

Fyl2x ; st(1) * log2 st(0)

F2xm1 ; (2^x) -1

Fld1 ; Load +1.0

Fadd

Pop BP

Ret

_PowFPU ENDP

Thanx :)

_PowFPU PROC

Push BP

Mov BP, SP

Fld DWORD PTR

Fld DWORD PTR

Fyl2x ; st(1) * log2 st(0)

F2xm1 ; (2^x) -1

Fld1 ; Load +1.0

Fadd

Pop BP

Ret

_PowFPU ENDP

Thanx :)

i think there's nothing wrong with the algorithm, but it seems that you should fld and instead of and

Obviously, your code would not work when the procedure is called because of your wrong references to the stack address. You probably tested it without calling it. Then it may work for source numbers between 0 and 2 exclusive regardless of the exponent, or for source numbers higher than 2 depending on the exponent.

First, you cannot use negative numbers as a source number. If you need to raise a negative number by an exponent, do it on the absolute value and adjust the result as required. The FPU will also dislike an input of 0 for the source number. you should avoid that since 0 to any power is always 0.

Following is my code for x^y (which you will find soon in the upcoming Fpu.lib library of functions for the FPU), after loading the exponent followed by loading the source number:

fyl2x ;->log2(Src1)*exponent

;the FPU can compute the antilog only with the mantissa of the logarithm

;the characteristic of the logarithm must thus be removed

fld st(0) ;copy the logarithm

frndint ;keep only the characteristic

fsub st(1),st ;keeps only the mantissa

fxch ;get the mantissa on top

f2xm1 ;->2^(mantissa)-1

fld1

fadd ;add 1 back

;the number must now be readjusted for the characteristic of the logarithm

fscale ;scale it with the characteristic

;the characteristic is still on the FPU and must be removed

fxch ;get the characteristic on top

fstp st(0) ;"pop" it

;the result is now on top of the FPU stack ready for the next operation

Raymond

First, you cannot use negative numbers as a source number. If you need to raise a negative number by an exponent, do it on the absolute value and adjust the result as required. The FPU will also dislike an input of 0 for the source number. you should avoid that since 0 to any power is always 0.

Following is my code for x^y (which you will find soon in the upcoming Fpu.lib library of functions for the FPU), after loading the exponent followed by loading the source number:

fyl2x ;->log2(Src1)*exponent

;the FPU can compute the antilog only with the mantissa of the logarithm

;the characteristic of the logarithm must thus be removed

fld st(0) ;copy the logarithm

frndint ;keep only the characteristic

fsub st(1),st ;keeps only the mantissa

fxch ;get the mantissa on top

f2xm1 ;->2^(mantissa)-1

fld1

fadd ;add 1 back

;the number must now be readjusted for the characteristic of the logarithm

fscale ;scale it with the characteristic

;the characteristic is still on the FPU and must be removed

fxch ;get the characteristic on top

fstp st(0) ;"pop" it

;the result is now on top of the FPU stack ready for the next operation

Raymond