操作碼 |
指令 |
說明 |
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 可以接受的源運算元範圍沒有任何限制。
在 80287 數學協處理器中,此指令的源運算元範圍限制如下:
0 |ST(1)| < |ST(0)| < +
ST(1) arctan(ST(1) / ST(0));
PopRegisterStack;
C1 - 如果發生堆疊下溢,則設定為 0。如果產生不精確的結果異常 (#P),則表示取整方向:0 非向上取整;1 向上取整。
C0、C2、C3 - 未定義。
#IS - 發生堆疊下溢。
#IA - 源運算元是 SNaN 值或不支援的格式。
#D - 源運算元是非規格化值。
#U - 結果對於目標格式而言太小。
#P - 值無法按目標格式精確表示。
#NM - 如果 CR0 中的 EM 或 TS 設定為 1。
#NM - 如果 CR0 中的 EM 或 TS 設定為 1。
#NM - 如果 CR0 中的 EM 或 TS 設定為 1。