_controlfp_s
取得及設定控制浮點數字。 這是一個版本的_control87,_controlfp __control87_2中所述的安全性增強功能與安全性功能,則在 CRT 中。
errno_t _controlfp_s(
unsigned int *currentControl,
unsigned int newControl,
unsigned int mask
);
參數
currentControl
目前的控制項文字的位元值。newControl
新的控制項文字位元值。mask
若要設定的新控制字位元遮罩。
傳回值
如果執行成功,或表示該工期為零errno錯誤碼的值。
備註
_controlfp_s平台無關且更安全版本的_control87,它會取得和設定插入的地址的浮點數控制字currentControl和newControl,分別。 在值] 的位元可指示浮點數的控制項狀態。 浮點數的控制項狀態可讓您變更精確度、 進位和無限值模式,在浮點運算套件中的程式。 人也遮罩或使用的浮點例外狀況的 unmask _controlfp_s。
如果值為mask的確等於 0, _controlfp_s取得浮點控制 word,並儲存擷取的值,在currentControl。
如果mask是不為零,控制 word 的新值設定: 位於 (等於 1),在任何位元的mask的對應位元new用來更新控制項的文字。 In other words, fpcntrl= ((fpcntrl& ~mask) |(new & mask)), fpcntrl是控制浮點數字。 在這個案例中, currentControl設定的值變更後。 它不是舊的字組的控制項位元值。
注意事項 |
---|
執行階段程式庫預設情況下,遮罩所有的浮點例外狀況。 |
_controlfp_s是幾乎等於_control87在 Intel (x86) 平台上運作,並且受 MIPS 且 ALPHA 平台。 若要確保帶到 MIPS] 或 [ALPHA 浮點數的程式碼,請使用_controlfp_s。 如果您的目標 x86 平台,請使用_control87 或_controlfp_s。
之間的差異_control87 和_controlfp_s 是這兩個函數處理的方式DENORMAL的值。 Intel (x86) 平台, _control87 可以設定並清除 [不正常運算元的例外狀況遮罩。 ALPHA 的平台不支援這個例外狀況,以及_controlfp_s 不會修改異常運算的運算元的例外狀況遮罩。 下列範例說明的差異:
_control87( _EM_INVALID, _MCW_EM );
// DENORMAL is unmasked by this call.
_controlfp( _EM_INVALID, _MCW_EM );
// DENORMAL exception mask remains unchanged.
可能的值,為遮罩常數 (mask) 和新控制項的值 (newControl) 以下的十六進位值表所示。 使用可移植的常數,如下所示 (_MCW_EM, _EM_INVALID,依此類推) 作為給這些函數的引數,而不是提供的十六進位值明確。
ALPHA 的平台支援 DENORMAL 輸入和輸出在軟體中的值。 Windows NT 在這些平台上的預設行為是排清 DENORMAL 輸入和輸出值為零。 _controlfp_s提供新的遮罩,用來保存及清除輸入和輸出 DENORMAL 值。
Intel (x86) 平台支援 DENORMAL 輸入和輸出在硬體中的值。 行為是保留 DENORMAL 的值。 _control87不提供這個遮罩用來變更這個行為。 下列範例會示範這種差異:
controlfp( _DN_SAVE, _MCW_DN);
// Denormal values preserved by software on ALPHA. NOP on x86
controlfp( _DN_FLUSH, _MCW_DN);
// Denormal values flushed to zero by hardware on ALPHA. Ignored on x86
_controlfp_s如果有的話,會影響控制項的文字 x87 和 SSE2。 很可能會彼此不一致的兩個字 (因為前一個呼叫的 __control87_2,例如)。 如果兩個控制項的文字之間有不一致的情形_controlfp_s設定EM_AMBIGUOUS中加上旗標currentControl。 這是一個警告傳回的控制 word 可能不會顯示這兩個浮點數的控制項文字的狀態正確。
在x64不支援變更浮點精確度的架構。 如果該平台上使用的精確度控制遮罩時,不正確的參數處理常式會叫用,如所述參數驗證。
如果遮罩不正確的設定,這個函式會產生不正確的參數例外狀況,如所述參數驗證。 如果執行則允許繼續執行,則這個函式會傳回EINVAL ,並設定errno到EINVAL。
這個函式已被取代,以編譯時/clr (Common Language Runtime 編譯)或/clr:pure因為 common language runtime 只支援預設的浮點精確度。
十六進位值
對於_MCW_EM遮罩] 中,清除 [遮罩設定的例外狀況,它可讓硬體例外狀況。 設定遮罩隱藏例外狀況。 請注意,如果_EM_UNDERFLOW或_EM_OVERFLOW ,就會發生,直到下一步的浮點指令執行時,就會擲回任何硬體例外狀況。 若要產生硬體例外狀況之後立即_EM_UNDERFLOW或_EM_OVERFLOW,呼叫 FWAIT MASM 指示。
遮罩 |
十六進位值 |
常數 |
十六進位值 |
---|---|---|---|
_MCW_DN(不正常的控制) |
0x03000000 |
_DN_SAVE _DN_FLUSH |
0x00000000 0x01000000 |
_MCW_EM(插斷的例外狀況遮罩) |
0x0008001F |
_EM_INVALID _EM_DENORMAL _EM_ZERODIVIDE _EM_OVERFLOW _EM_UNDERFLOW _EM_INEXACT |
0x00000010 0x00080000 0x00000008 0x00000004 0x00000002 0x00000001 |
_MCW_IC(無限大控制) |
0x00040000 |
_IC_AFFINE _IC_PROJECTIVE |
0x00040000 0x00000000 |
_MCW_RC(圓的控制項) |
0x00000300 |
_RC_CHOP _RC_UP _RC_DOWN _RC_NEAR |
0x00000300 0x00000200 0x00000100 0x00000000 |
_MCW_PC(精確控制) |
0x00030000 |
_PC_24(24 位元) _PC_53(53 位元) _PC_64(64 位元) |
0x00020000 0x00010000 0x00000000 |
需求
常式 |
所需的標頭 |
---|---|
_controlfp_s |
<float.h> |
如需相容性資訊,請參閱相容性在簡介中。
範例
// crt_contrlfp_s.c
// processor: x86
// This program uses _controlfp_s to output the FP control
// word, set the precision to 24 bits, and reset the status to
// the default.
//
#include <stdio.h>
#include <float.h>
#pragma fenv_access (on)
int main( void )
{
double a = 0.1;
unsigned int control_word;
int err;
// Show original FP control word and do calculation.
err = _controlfp_s(&control_word, 0, 0);
if ( err ) /* handle error here */;
printf( "Original: 0x%.4x\n", control_word );
printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );
// Set precision to 24 bits and recalculate.
err = _controlfp_s(&control_word, _PC_24, MCW_PC);
if ( err ) /* handle error here */;
printf( "24-bit: 0x%.4x\n", control_word );
printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );
// Restore default precision-control bits and recalculate.
err = _controlfp_s(&control_word, _CW_DEFAULT, MCW_PC);
if ( err ) /* handle error here */;
printf( "Default: 0x%.4x\n", control_word );
printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );
}
Output
Original: 0x9001f
0.1 * 0.1 = 1.000000000000000e-002
24-bit: 0xa001f
0.1 * 0.1 = 9.999999776482582e-003
Default: 0x9001f
0.1 * 0.1 = 1.000000000000000e-002
NET Framework 的對等用法
不適用。 若要呼叫標準的 c 函式,使用PInvoke。 如需詳細資訊,請參閱平台叫用範例。