FYL2XP1 - 計算 y * log2(x +1)

操作碼

指令

說明

D9 F9

FYL2XP1

將 ST(1) 替換成 ST(1) * log 2 (ST(0) + 1.0),並彈出暫存器堆疊

說明

以 epsilon 為底,計算 (ST(1) * log2 ST(0) + 1.0)) 的對數,結果儲存到暫存器 ST(1),並彈出 FPU 暫存器堆疊。ST(0) 中的源運算元必須在以下範圍內:

ST(1) 中的源運算元範圍是從 - 到 +。如果 ST(0) 運算元超出可接受範圍,則結果未定義,軟體不應依賴產生的異常。在某些情況下,ST(0) 超出範圍時可能會產生異常,但此行為取決於具體的版本,具有一定的不確定性。

下表顯示計算各類數值以 epsilon 為底的對數時得到的結果(假設未發生下溢)。

 ST(0)

 

 

 

 

 

ST(1)

 

-(1 - ( )) 到 -0

-0

+0

+0 到 +(1 - ( ))

NaN

-

+

*

*

-

NaN

-F

+F

+0

-0

-F

NaN

-0

+0

+0

-0

-0

NaN

+0

-0

-0

+0

+0

NaN

+F

-F

-0

+0

+F

NaN

+

-

*

*

+

NaN

NaN

NaN

NaN

NaN

NaN

NaN

備註:F 表示有限實數。

* 表示浮點操作無效 (#IA) 異常。

此指令能夠為接近 0 的各種 epsilon 值 [暫存器 ST(0) 中的值] 提供最佳精度。對於很小的 epsilon () 值,同將 (+1) 用作 FYL2X 指令的參數相比,使用 FYL2XP1 指令可以保留更多的有效位。在複利與養老金計算中,經常可以看到 (+1) 表達式。通過在 ST(1) 源運算元中儲存比例係數,很容易將結果轉換成另一個底數的對數值。以下等式用於計算特定對數底數的比例係數,其中 n 是 FYL2XP1 指令的結果所需的對數底數:

scale factor log n 2

操作

ST(1) ST(1) * log2(ST(0) + 1.0);
PopRegisterStack;

影響的 FPU 標誌

C1 - 如果發生堆疊下溢,則設定為 0。如果產生不精確的結果異常 (#P),則表示取整方向:

0 非向上取整;1 向上取整。

C0、C2、C3 - 未定義。

浮點異常

#IS - 發生堆疊下溢。

#IA - 運算元是 SNaN 值或不支援的格式。

#D - 源運算元是非規格化值。

#U - 結果對於目標格式而言太小。

#O - 結果對於目標格式而言太大。

#P - 值無法按目標格式精確表示。

保護模式異常

#NM - 如果 CR0 中的 EM 或 TS 設定為 1。

實地址模式異常

#NM - 如果 CR0 中的 EM 或 TS 設定為 1。

虛 8086 模式異常

#NM - 如果 CR0 中的 EM 或 TS 設定為 1。