1

y(i) = sin(5*i)度の合計を計算する必要があります。ここで、iは反復ごとに増加します。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
 }  
}
4

2 に答える 2

4

そこにいくつかの問題があります。

  1. FMUL浮動小数点引数が必要ですが、を渡しlongます。
  2. FICOMFPUフラグを設定するだけで、CPUに移動するか、を使用する必要がありますFCOMI
  3. JG間違ったフラグをチェックしている場合は、キャリーフラグをチェックする必要があります。
  4. コードは浮動小数点スタックのバランスを崩します。

ボーナス: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"

動作中を参照してください。

于 2012-11-04T02:13:55.033 に答える
0

トピックから外れているかもしれませんが、単純な三角関数公式を使用すると、単純な式を使用して、任意の合計値のループなしで回答を計算できます。

i=ceil(acos(cos(t/2)-2*result_sum*sin(t/2))/t-0.5)

ここで、tはステップ角(5度)、result_sum-連続する正弦の必要な累積合計(この場合は= 3)

于 2012-11-04T06:08:44.937 に答える