_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соответственно.Биты в значениях указывающие состояние элемента управления с плавающей запятой.Состояние элемента управления с плавающей запятой позволяет программа, чтобы изменить точность, округление и режимы бесконечности в пакете math с плавающей запятой.Он может также маска или демаскировать исключения с плавающей запятой с помощью _controlfp_s.
Если значение mask равны 0, _controlfp_s возвращает машинное слово элемента управления с плавающей запятой и сохраняет полученное значение в пределах currentControl.
If mask значение ненулевое, новое значение для машинного слова элемента управления set: Для каждого бита, on (равным 1) maskсоответствующий бит in new используется для обновления машинное слово элемента управления.Иначе говоря, fpcntrl = ((fpcntrl & ~mask) | (new & mask)) где fpcntrl машинное слово элемента управления с плавающей запятой.В этом сценарии currentControl устанавливается равным значению после завершения изменения; не старого битовые значения элемента управления-машинного слова.
Примечание |
---|
Маска библиотек времени выполнения по умолчанию все исключения с плавающей запятой. |
_controlfp_s почти идентичны _control87 функция на платформах Intel (x86) и поддерживается платформами MIPS и АЛЬФЫ-ВЕРСИИ.Чтобы убедиться, что код с плавающей запятой можно переносить в MIPS или АЛЬФЕ-ВЕРСИИ, используйте _controlfp_s.Если предназначен для платформы x86, используйте _control87OR _controlfp_s.
Различие _control87и _controlfp_sспособ обслуживание этих функций 2 DENORMAL значения.Для платформ Intel (x86) _control87позволяет устанавливать и снимите маску исключения ОПЕРАНДА DENORMAL.Платформы АЛЬФЫ-ВЕРСИИ не поддерживают данное исключение. _controlfp_sне изменяет маску исключения ОПЕРАНДА DENORMAL.Следующий пример демонстрирует различие:
_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и т д) в качестве аргументов к этим функциям, а не указывая шестнадцатеричные значения явно.
Платформы АЛЬФЫ-ВЕРСИИ поддерживают значения ввода и вывода 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 при его наличии.Возможно, 2 машинных слов элемента управления сбивчиво друг с другом (в результате предыдущего вызова метода __control87_2, например); если несогласованность между 2 машинными словами элемента управления _controlfp_s устанавливает EM_AMBIGUOUS пометить in currentControl.Это предупреждение о том, что возвращаемое машинное слово элемента управления не может представлять состояние обоих машинных слов элемента управления с плавающей запятой.
На x64 архитектура, изменение точности с плавающей запятой не поддерживается.Если маска элемента управления точности используется на этой платформе, то вызывается обработчик недопустимого параметра, как описано в разделе Проверка параметров.
Если маска не установлена правильно, эта функция создает исключение недопустимого параметра, как описано в разделе Проверка параметров.Если выполнение может быть продолжено, то эта функция возвращает EINVAL и наборы errno В EINVAL.
Эта функция нерекомендуема при компилировании с /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 |
Требования
Процедура |
Обязательный заголовок |
---|---|
_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 Число .NET Framework
Неприменимо.Для c# используйте стандартная функция PInvoke.Дополнительные сведения см. в разделе Примеры вызовов неуправляемого кода.