操作碼 |
指令 |
說明 |
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;
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。
#NM - 如果 CR0 中的 EM 或 TS 設定為 1。