_control87, _controlfp, __control87_2

Возвращает и задает машинное слово элемента управления с плавающей запятой.Более безопасную версию _controlfp доступны; см. _controlfp_s.

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
);

Параметры

  • new
    Новые битовые значения элемента управления-машинного слова.

  • mask
    Маска для новых бит элемент управления-машинного слова, которое необходимо установить.

  • x86_cw
    Вводится с машинным словом элемента управления для единицы измерения с плавающей запятой x87.Передайте 0 (NULLтолько машинное слово) задайте для элемента управления SSE2.

  • sse2_cw
    Машинное слово элемента управления для единицы измерения с плавающей запятой SSE.Передайте 0 (NULLтолько машинное слово) задайте для элемента управления x87.

Возвращаемое значение

Для _control87 и _controlfpбиты в возвращаемом значении, указывающие состояние элемента управления с плавающей запятой.Для полного определения бит, возвращенных by _control87см. в разделе FLOAT.H.

Для __control87_2возвращаемое значение 1, что означает успешное завершение.

Заметки

_control87функция возвращает и задает машинное слово элемента управления с плавающей запятой.Машинное слово элемента управления с плавающей запятой позволяет программа, чтобы изменить точность, округление и режимы бесконечности в пакете math с плавающей запятой.Можно также маска или демаскировать исключения с плавающей запятой с помощью _control87.Если значение mask равны 0, _control87возвращает машинное слово элемента управления с плавающей запятой.If mask значение ненулевое, новое значение для машинного слова элемента управления set: Для каждого бита, on (равным 1) maskсоответствующий бит in new используется для обновления машинное слово элемента управления.Иначе говоря, fpcntrl = ((fpcntrl & ~mask) | (new & mask)) где fpcntrl машинное слово элемента управления с плавающей запятой.

ПримечаниеПримечание

Маска библиотек времени выполнения по умолчанию все исключения с плавающей запятой.

_controlfp независимая от платформы, портативная версия _control87.Она почти идентична _control87функция на платформах Intel (x86) и поддерживается платформами MIPS и АЛЬФЫ-ВЕРСИИ.Чтобы убедиться, что код с плавающей запятой можно переносить в MIPS или АЛЬФЕ-ВЕРСИИ, используйте _controlfp.Если предназначен для платформы x86, используйте _control87OR _controlfp.

Различие _control87и _controlfpспособ эти значения обслуживания DENORMAL 2 функций.Для платформ Intel (x86) _control87позволяет устанавливать и снимите маску исключения ОПЕРАНДА DENORMAL.Платформы АЛЬФЫ-ВЕРСИИ не поддерживают данное исключение. _controlfpне изменяет маску исключения ОПЕРАНДА DENORMAL.Следующий пример демонстрирует различие:

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

Возможные значения для маски (константыmask), а новые значения элемента управленияnew) показывать в следующей таблице шестнадцатеричных значений.Используйте перечисленные ниже (переносимые константы_MCW_EM" _EM_INVALIDи т д) в качестве аргументов к этим функциям, а не указывая шестнадцатеричные значения явно.

Платформы АЛЬФЫ-ВЕРСИИ поддерживают значения ввода и вывода DENORMAL в программе.По умолчанию функциональности на этих платформах Windows NT сброса значения входов и выходов значение равное нулю. DENORMAL_controlfp предоставляет новую маску для сохранения и сбросить значения ввода и вывода 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 and x86
// processors with SSE2 support. Ignored on other x86 platforms.

Оба _control87 и _controlfp применяется к машинные слова элемента управления как для x87 и SSE2 при его наличии.Функция __control87_2 позволяет и единицы измерения с плавающей запятой x87 и SSE2 для отслеживания вместе или по отдельности.Если требуется повлиять на обе единицы, передайте в целых чисел в address 2 x86_cw и sse2_cw.Если необходимо только повлиять на одну единицу измерения, передайте адрес для этого параметра, но передайте 0 (NULL) для другого.Если 0 передается для одного из этих параметров, то функция не влияет на этой единицы измерения с плавающей запятой.Эта функция может оказаться полезной в тех случаях, когда часть кода использует единицы измерения с плавающей запятой x87 а другая часть кода использует единицы измерения с плавающей запятой SSE2.При использовании __control87_2 в одной части программы и различных значений набора в машинных слов элемента управления с плавающей запятой, а затем используйте _control87 OR _controlfp далее управления машинное слово элемента управления, после чего _control87 и _controlfp может быть невозможно вернуть единственное машинное слово элемента управления, чтобы представлять состояние обеих единиц с плавающей запятой.В таком случае эти функции задавать EM_AMBIGUOUS пометить в возвращенном целочисленном значение для указания того, что несогласованность между 2 машинными словами элемента управления.Это предупреждение о том, что возвращаемое машинное слово элемента управления не может представлять состояние обоих машинных слов элемента управления с плавающей запятой.

На x64 архитектура, изменение точности с плавающей запятой не поддерживается.Если маска элемента управления точности используется на этой платформе, то проверочное утверждение и недопустимый обработчик параметров вызываются, как описано в разделе Проверка параметров.

ПримечаниеПримечание

__control87_2 не поддерживается в x64 архитектура.При использовании __control87_2 и компилирование программы для x64 архитектура компилятор выдает ошибку.

Эти функции нерекомендуемый при компилировании с /clr (компиляция CLR) OR /clr:pure поскольку среда CLR поддерживает только по умолчанию точности с плавающей запятой.

Шестнадцатеричные значения

Для _MCW_EM маска, очистя маска задает исключение, разрешающее аппаратное исключение. устанавливать маску скрывает исключение.Обратите внимание, что значение a _EM_UNDERFLOW OR _EM_OVERFLOW не выполняется никаких аппаратное исключение будет создано до тех пор, пока не выполнена следующая инструкция с плавающей запятой.Аппаратное сразу после создания исключения _EM_UNDERFLOW OR _EM_OVERFLOWвызовите инструкция FWAIT MASM.

Маска

Шестнадцатеричное значение

Константа

Шестнадцатеричное значение

_MCW_DN (Элемент управления Denormal)

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

Требования

Процедура

Обязательный заголовок

_control87, _controlfp, _control87_2

<float.h>

Дополнительные сведения о совместимости см. Совместимость во введении.

Пример

// 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 );
}

Output

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

Эквивалент в .NET Framework

Неприменимо. Для c# используйте стандартная функция PInvoke. Дополнительные сведения см. в разделе Примеры вызовов неуправляемого кода.

См. также

Ссылки

Поддержка чисел с плавающей запятой

_clear87, _clearfp

_status87, _statusfp, _statusfp2