_control87、_controlfp、__control87_2_control87, _controlfp, __control87_2

浮動小数点制御ワードの取得および設定を行います。Gets and sets the floating-point control word. より安全なバージョン _controlfpが利用できるを参照してください。 _controlfp_sします。A more secure version of _controlfp is available; see _controlfp_s.

構文Syntax

unsigned int _control87(
   unsigned int new,
   unsigned int mask
);
unsigned int _controlfp(
   unsigned int new,
   unsigned int mask
);
int __control87_2(
   unsigned int new,
   unsigned int mask,
   unsigned int* x86_cw,
   unsigned int* sse2_cw
);

パラメーターParameters

newnew
新しい制御ワードのビット値。New control-word bit values.

マスクmask
新しく設定する制御ワード ビットのマスク。Mask for new control-word bits to set.

x86_cwx86_cw
x87 浮動小数点ユニットの制御ワードが格納されます。Filled in with the control word for the x87 floating-point unit. 0 を渡します (NULL) SSE2 制御ワードのみを設定します。Pass in 0 (NULL) to set only the SSE2 control word.

sse2_cwsse2_cw
SSE 浮動小数点ユニットの制御ワード。Control word for the SSE floating-point unit. 0 を渡します (NULL) x87 のみを設定する制御ワード。Pass in 0 (NULL) to set only the x87 control word.

戻り値Return Value

_Control87_controlfp、浮動小数点のコントロールの状態を示す値のビットが返されます。For _control87 and _controlfp, the bits in the value returned indicate the floating-point control state. によって返されるビットの定義の _control87FLOAT を参照してください。H.For a complete definition of the bits that are returned by _control87, see FLOAT.H.

_ _Control87_2、戻り値は 1 で、成功を示します。For __control87_2, the return value is 1, which indicates success.

RemarksRemarks

_Control87関数を取得し、浮動小数点制御ワードを設定します。The _control87 function gets and sets the floating-point control word. 浮動小数点制御ワードを使用すると、プログラムで使用する浮動小数点演算パッケージの精度、丸め、および無限大の各モードをプラットフォームに応じて変更できます。The floating-point control word enables the program to change the precision, rounding, and infinity modes in the floating-point math package, depending on the platform. 使用することも _control87をマスクしたり、浮動小数点例外をマスク解除します。You can also use _control87 to mask or unmask floating-point exceptions. 場合の値は、マスクが 0、 _control87浮動小数点制御ワードを取得します。If the value for mask is equal to 0, _control87 gets the floating-point control word. 場合マスクが 0 以外の場合、制御ワードに新しい値が設定。いずれかのビットでは (つまり、1 に等しく) でマスク、対応するビット新しい制御ワードの更新に使用します。If mask is nonzero, a new value for the control word is set: For any bit that is on (that is, equal to 1) in mask, the corresponding bit in new is used to update the control word. つまり、 fpcntrl = ((fpcntrl & ~マスク) | (新しい & マスク))場所fpcntrl浮動小数点制御ワードです。In other words, fpcntrl = ((fpcntrl & ~mask) | (new & mask)) where fpcntrl is the floating-point control word.

注意

既定では、ランタイム ライブラリは、すべての浮動小数点例外をマスクします。By default, the run-time libraries mask all floating-point exceptions.

_controlfpのプラットフォームに依存しない、移植可能なバージョンは、 _control87します。_controlfp is a platform-independent, portable version of _control87. ほぼ同じですが、 _control87 x86、x64、および ARM プラットフォームで機能します。It is nearly identical to the _control87 function on x86, x64, and ARM platforms. X86、x64、または ARM プラットフォームをターゲットにする場合を使用して、 _control87または _controlfpします。If you are targeting x86, x64, or ARM platforms, use _control87 or _controlfp.

間の差 _control87_controlfp DENORMAL 値の処理方法にします。The difference between _control87 and _controlfp is in how they treat DENORMAL values. X86、x64、および ARM プラットフォームでは、 _control87設定および DENORMAL OPERAND 例外マスクを解除できます。For x86, x64, and ARM platforms, _control87 can set and clear the DENORMAL OPERAND exception mask. _controlfp DENORMAL OPERAND 例外マスクを変更しません。_controlfp does not modify the DENORMAL OPERAND exception mask. 次の例に、この違いを示します。This example demonstrates the difference:

_control87( _EM_INVALID, _MCW_EM );
// DENORMAL is unmasked by this call
_controlfp( _EM_INVALID, _MCW_EM );
// DENORMAL exception mask remains unchanged

マスク定数の有効な値 (マスク) とコントロールの新しい値 (新しい) の 16 進値の次の表を示します。The possible values for the mask constant (mask) and new control values (new) are shown in the following Hexadecimal Values table. 以下に示すポータブル定数を使用して (_MCW_EM_EM_INVALIDなど)、これらの関数に引数として、16 進数値を指定せずに明示的にします。Use the portable constants listed below (_MCW_EM, _EM_INVALID, and so forth) as arguments to these functions, rather than supplying the hexadecimal values explicitly.

Intel x86 から派生したプラットフォームでは、DENORMAL 入力をサポートして、出力ハードウェアでの値。Intel x86-derived platforms support the DENORMAL input and output values in hardware. x86 では DENORMAL 値を保持するように動作します。The x86 behavior is to preserve DENORMAL values. ARM プラットフォームおよび SSE2 のプラットフォーム サポート x64 には、DENORMAL オペランドと結果をフラッシュするには、または強制的に 0 が有効にします。The ARM platform and the x64 platforms that have SSE2 support enable DENORMAL operands and results to be flushed, or forced to zero. _Controlfp_control87関数は、この動作を変更するマスクを提供します。The _controlfp and _control87 functions provide a mask to change this behavior. このマスクの使用例を次に示します。The following example demonstrates the use of this mask.

_controlfp(_DN_SAVE, _MCW_DN);
// Denormal values preserved on ARM platforms and on x64 processors with
// SSE2 support. NOP on x86 platforms.
_controlfp(_DN_FLUSH, _MCW_DN);
// Denormal values flushed to zero by hardware on ARM platforms
// and x64 processors with SSE2 support. Ignored on other x86 platforms.

ARM プラットフォームで、 _control87_controlfp関数は FPSCR レジスタに適用されます。On ARM platforms, the _control87 and _controlfp functions apply to the FPSCR register. X64 アーキテクチャでは、格納されている SSE2 制御ワードのみで、MXCSR レジスタが影響を受けます。On x64 architectures, only the SSE2 control word that's stored in the MXCSR register is affected. X86 プラットフォームでは、 _control87_controlfp存在する場合は x87 と SSE2 の両方の制御ワードに影響します。On x86 platforms, _control87 and _controlfp affect the control words for both the x87 and the SSE2, if present. 関数は、 _ _control87_2は x87 と SSE2 の浮動小数点ユニットを単独でまたは組み合わせて制御の両方を使用します。The function __control87_2 enables both the x87 and SSE2 floating-point units to be controlled together or separately. 両方のユニットに影響する場合に 2 つの整数のアドレスを渡すx86_cwsse2_cwします。If you want to affect both units, pass in the addresses of two integers to x86_cw and sse2_cw. 1 つのユニットに影響する場合は、そのパラメーターのアドレスを渡しますが、0 を渡します (NULL)、その他のです。If you only want to affect one unit, pass in an address for that parameter but pass in 0 (NULL) for the other. いずれかのパラメーターに対して 0 が渡されると、関数はその浮動小数点ユニットには影響しません。If 0 is passed for one of these parameters, the function has no effect on that floating-point unit. この機能は、コードの一部では x87 浮動小数点ユニットを使用し、別の部分では SSE2 浮動小数点ユニットを使用する場合に役立ちます。This functionality could be useful in situations where part of the code uses the x87 floating-point unit and another part of the code uses the SSE2 floating-point unit. 使用する場合 _ _control87_2プログラムの 1 つの部分での浮動小数点制御ワード、別の値を設定しを使用して _control87または _controlfpをさらに制御ワードを操作 _control87_controlfpを両方の浮動小数点ユニットの状態を表す単一の制御ワードを返すことがない可能性があります。If you use __control87_2 in one part of a program and set different values for the floating-point control words, and then use _control87 or _controlfp to further manipulate the control word, then _control87 and _controlfp might be unable to return a single control word to represent the state of both floating-point units. このような場合は、これらの関数の設定、 EM_AMBIGUOUSを 2 つの制御ワード間で不整合があることを示す整数の戻り値のフラグ。In such a case, these functions set the EM_AMBIGUOUS flag in the returned integer value to indicate that there is an inconsistency between the two control words. これは、返された制御ワードが両方の浮動小数点制御ワードの状態を正確に表していない可能性があるという警告です。This is a warning that the returned control word might not represent the state of both floating-point control words accurately.

ARM および x64 アーキテクチャでは、無限大モードまたは浮動小数点の精度の変更はサポートされていません。On the ARM and x64 architectures, changing the infinity mode or the floating-point precision is not supported. 精度の制御マスクが x64 で使用されるかどうか、関数、プラットフォーム、アサーションと」の説明に従って、無効なパラメーター ハンドラーが呼び出されますパラメーターの検証です。If the precision control mask is used on the x64 platform, the function raises an assertion and the invalid parameter handler is invoked, as described in Parameter Validation.

注意

_ _control87_2 ARM または x64 ではサポートされていませんアーキテクチャ。__control87_2 is not supported on the ARM or x64 architectures. 使用する場合 _ _control87_2プログラムをコンパイル、ARM または x64 のアーキテクチャでは、コンパイラ エラーが発生します。If you use __control87_2 and compile your program for the ARM or x64 architectures, the compiler generates an error.

使用する場合、これらの関数は無視されます/clr (共通言語ランタイムのコンパイル)共通言語ランタイム (CLR) には、浮動小数点の既定の精度のみサポートしているため、コンパイルします。These functions are ignored when you use /clr (Common Language Runtime Compilation) to compile because the common language runtime (CLR) only supports the default floating-point precision.

16 進数の値Hexadecimal Values

_MCW_EMマスク、マスク オフにすると、例外は、ハードウェア例外を許可の設定は、例外を非表示にマスクを設定します。For the _MCW_EM mask, clearing the mask sets the exception, which allows the hardware exception; setting the mask hides the exception. 場合、 _EM_UNDERFLOWまたは _EM_OVERFLOW発生すると、次の浮動小数点命令が実行されるまでハードウェア例外はスローされません。If a _EM_UNDERFLOW or _EM_OVERFLOW occurs, no hardware exception is thrown until the next floating-point instruction is executed. ハードウェア例外を生成する後すぐに _EM_UNDERFLOWまたは _EM_OVERFLOWを呼び出し、 FWAIT MASM 命令。To generate a hardware exception immediately after _EM_UNDERFLOW or _EM_OVERFLOW, call the FWAIT MASM instruction.

マスクMask 16 進値Hex value 定数Constant 16 進値Hex value
_MCW_DN (denormal 制御)_MCW_DN (Denormal control) 0x030000000x03000000 _DN_SAVE_DN_SAVE

_DN_FLUSH_DN_FLUSH
0x000000000x00000000

0x010000000x01000000
_MCW_EM (割り込み例外マスク)_MCW_EM (Interrupt exception mask) 0x0008001F0x0008001F _EM_INVALID_EM_INVALID

_EM_DENORMAL_EM_DENORMAL

_EM_ZERODIVIDE_EM_ZERODIVIDE

_EM_OVERFLOW_EM_OVERFLOW

_EM_UNDERFLOW_EM_UNDERFLOW

_EM_INEXACT_EM_INEXACT
0x000000100x00000010

0x000800000x00080000

0x000000080x00000008

0x000000040x00000004

0x000000020x00000002

0x000000010x00000001
_MCW_IC (無限制御)_MCW_IC (Infinity control)

(ARM または x64 ではサポートされていません] プラットフォームです)。(Not supported on ARM or x64] platforms.)
0x000400000x00040000 _IC_AFFINE_IC_AFFINE

_IC_PROJECTIVE_IC_PROJECTIVE
0x000400000x00040000

0x000000000x00000000
_MCW_RC (丸め制御)_MCW_RC (Rounding control) 0x000003000x00000300 _RC_CHOP_RC_CHOP

_RC_UP_RC_UP

_RC_DOWN_RC_DOWN

_RC_NEAR_RC_NEAR
0x000003000x00000300

0x000002000x00000200

0x000001000x00000100

0x000000000x00000000
_MCW_PC (精度制御)_MCW_PC (Precision control)

(サポートされていません ARM または x64 プラットフォームです。)(Not supported on ARM or x64 platforms.)
0x000300000x00030000 _PC_24 (24 ビット)_PC_24 (24 bits)

_PC_53 (53 ビット)_PC_53 (53 bits)

_PC_64 (64 ビット)_PC_64 (64 bits)
0x000200000x00020000

0x000100000x00010000

0x000000000x00000000

必要条件Requirements

ルーチンによって返される値Routine 必須ヘッダーRequired header
_control87_controlfp_control87_2_control87, _controlfp, _control87_2 <float.h><float.h>

互換性の詳細については、「互換性」を参照してください。For more compatibility information, see Compatibility.

Example

// crt_cntrl87.c
// processor: x86
// This program uses __control87_2 to output the x87 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_x87;

    // Show original x87 control word and do calculation.
    control_word_x87 = __control87_2(0, 0,
                                     &control_word_x87, 0);
    printf( "Original: 0x%.4x\n", control_word_x87 );
    printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );

    // Set precision to 24 bits and recalculate.
    control_word_x87 = __control87_2(_PC_24, MCW_PC,
                                     &control_word_x87, 0);
    printf( "24-bit:   0x%.4x\n", control_word_x87 );
    printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );

    // Restore default precision-control bits and recalculate.
    control_word_x87 = __control87_2( _CW_DEFAULT, MCW_PC,
                                     &control_word_x87, 0 );
    printf( "Default:  0x%.4x\n", control_word_x87 );
    printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );
}
Original: 0x0001
0.1 * 0.1 = 1.000000000000000e-002
24-bit:   0x0001
0.1 * 0.1 = 9.999999776482582e-003
Default:  0x0001
0.1 * 0.1 = 1.000000000000000e-002

関連項目See also

浮動小数点サポートFloating-Point Support
_clear87、_clearfp_clear87, _clearfp
_status87、_statusfp、_statusfp2_status87, _statusfp, _statusfp2
_controlfp_s_controlfp_s