_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。如需詳細資訊,請參閱平台叫用範例

請參閱

參考

浮點支援

_clear87 _clearfp

_status87,_statusfp _statusfp2