FPATAN - 部分反正切

操作碼

指令

說明

D9 F3

FPATAN

將 ST(1) 替換成 arctan(ST(1)/ST(0)),並彈出暫存器堆疊

說明

將暫存器 ST(1) 中的源運算元除以暫存器 ST(0) 中的源運算元,然後計算商的反正切,結果儲存到 ST(1),並彈出 FPU 暫存器堆疊。暫存器 ST(0) 中的結果的符號與源運算元 ST(1) 的相同,並且數值比 + 小。

FPATAN 指令返回 X 軸同原點及點 (X,Y) 確定的直線之間的角度,其中 Y(縱座標)是 ST(1),X(橫座標)是 ST(0)。此角度同 X 與 Y 的符號都有關,而不只是同比率 Y/X 的符號有關。這是因為點 (-X,Y) 位於第二象限,得到的角度在 /2 與 之間,而點 (X,-Y) 位於第四象限,得到的角度在 0 與 -/2 之間。點 (-X,-Y) 位於第三象限,得到的角度在 -/2 與 - 之間。

下表顯示計算各類數值的反正切時得到的結果(假設未發生下溢)。

 

ST(0)

ST(1)

 

-

-F

-0

+0

+F

+

NaN

-

-3/4*

-/2

-/2

-/2

-/2

-/4*

NaN

-F

-

- 到 -/2

-/2

-/2

-/2 到 -0

-0

NaN

-0

-

-

-*

-0*

-0

-0

NaN

+0

+

+

+*

+0*

+0

+0

NaN

+F

+

+ 到 +/2

+/2

+/2

+/2 到 +0

+0

NaN

+

+3/4*

+/2

+/2

+/2

+/2

+/4*

NaN

NaN

NaN

NaN

NaN

NaN

NaN

NaN

NaN

備註:F 表示有限實數。

*“IA-32 英特爾(R) 體系結構軟件開發人員手冊”第 1 卷“表 7-20”指定比率 0/0 與 / 會產生浮點算術操作無效異常,並且,如果設定此異常的掩碼,則返回無窮大的實數值。使用 FPATAN 指令時,實際上不使用除法計算 0/0 或 / 值。相反,這兩個變數的反正切根據通用的標準數學公式推導,此公式能夠將複數用作參數。在這個復變數公式中,反正切 (0,0) 等都有非常明確的值。在以只能接受實數參數的 FPU 函式為基礎,來開發計算帶複數參數的超越函式庫時,需要用到這些值。

FPATAN 可以接受的源運算元範圍沒有任何限制。

英特爾(R) 體系結構相容性

在 80287 數學協處理器中,此指令的源運算元範圍限制如下:

0 |ST(1)| < |ST(0)| < +

操作

ST(1) arctan(ST(1) / ST(0));
PopRegisterStack;

影響的 FPU 標誌

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

C0、C2、C3 - 未定義。

浮點異常

#IS - 發生堆疊下溢。

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

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

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

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

保護模式異常

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

實地址模式異常

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

虛 8086 模式異常

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