35

pow(real, real)x86アセンブリでの実装を探しています。また、アルゴリズムがどのように機能するかを理解したいと思います。

4

3 に答える 3

67

として計算するだけ2^(y*log2(x))です。

y*log2(x) を計算する x86 命令 FYL2X と、累乗を行う x86 命令 F2XM1 があります。F2XM1 は [-1,1] の範囲の引数を必要とするため、整数部分と剰余を抽出し、剰余を累乗し、FSCALE を使用して適切な 2 の累乗で結果をスケーリングするために、間にコードを追加する必要があります。

于 2011-01-09T09:26:48.657 に答える
16

OK、power(double a, double b, double * result);あなたが推奨したとおりに x86 で実装しました。

コード: http://pastebin.com/VWfE9CZT

%define a               QWORD [ebp+8]
%define b               QWORD [ebp+16]
%define result          DWORD [ebp+24]
%define ctrlWord            WORD [ebp-2]
%define tmp             DWORD [ebp-6]

segment .text
    global power

power:
    push ebp
    mov ebp, esp
    sub esp, 6
    push ebx

    fstcw ctrlWord
    or ctrlWord, 110000000000b
    fldcw ctrlWord

    fld b
    fld a
    fyl2x

    fist tmp

    fild tmp
    fsub
    f2xm1
    fld1
    fadd
    fild tmp
    fxch
    fscale

    mov ebx, result
    fst QWORD [ebx]

    pop ebx
    mov esp, ebp
    pop ebp
    ret
于 2011-01-09T18:18:59.567 に答える