我需要计算y(i) = sin(5*i)的度数和,其中i在每次迭代时都会增加。我需要在和大于3之前计算它,并在和大于3时找到i。
使用下面的代码,我得到了一个无限循环:
int main() {
float Sum=0;
long i=0;
long A=5;
long B=180;
int C=3;
_asm{
finit
m1:
inc i
fldpi ; load PI
fmul i ; PI * i
fmul A ; PI * i * 5
fdiv B ; PI * i * 5 / 180 (value in degree)
fsin ; sin(PI * i * 5 / 180)
fadd Sum ; counter all lopps result
ficom C ; check if lower than 3 go to m1
jg m1
}
}发布于 2012-11-04 10:13:55
有几个问题。
FMUL需要浮点参数,但您传递的long.FICOM仅设置了FPU标志,您必须将它们移到CPU或使用FCOMI.JG检查错误的标志,您需要检查进位标志。奖励:由于5*PI/180是常数,你可以预先计算出来。
您可以使用如下代码(针对您的编译器语法进行调整,这是针对gnu汇编程序的):
.intel_syntax noprefix
.globl main
main:
sub esp, 16 # allocate space for i, sum and fmt
mov dword ptr [esp+4], -1 # i
fild dword ptr [limit] # limit
fldz # sum
1:
inc dword ptr [esp+4] # i += 1
fild dword ptr [esp+4] # i
fmul qword ptr [factor] # i * factor
fsin
faddp # add to sum
fcomi st, st(1) # check if below limit
jb 1b
fstp qword ptr [esp+8] # store on stack for printf
fstp st(0) # remove limit from fpu stack
mov dword ptr [esp], offset fmt
call printf
add esp, 16 # clean up stack
xor eax, eax # return value
ret
.data
factor: .double .08726646259971647884 # 5 * PI / 180
limit: .int 3
fmt: .string "i=%d sum=%g\n"See in operation.
发布于 2012-11-04 14:08:45
也许这是离题的,但是使用简单的三角恒等式,你可以用一个简单的公式计算出没有任何循环的任意和值的答案:
i=ceil(acos(cos(t/2)-2*result_sum*sin(t/2))/t-0.5)其中t是您的步长角(5度),result_sum需要的连续正弦的累积和(在您的情况下=3)
https://stackoverflow.com/questions/13212795
复制相似问题