C++ Builder 串口控件 | C++ Builder 编程技巧 | C++ Builder 操作指南 | C++ Builder 参考手册 | 基础知识 | cfloat 浮点数 | • 浮点数类型 | • 浮点数异常处理 | • _finite, _finitel | • _isinf, _isinfl | • _isnan, _isnanl | • _fpclass, _fpclassl | • _chgsign, _chgsignl | • _copysign, _copysignl | • _logb, _logbl | • _scalb, _scalbl | • _nextafter, _nextafterl | • _clear87, _clearfp | • _control87, _controlfp | • _status87, _statusfp | • _fpreset | cmath 数学函数 | cstdlib 标准库函数 | System 字符串 | System 日期和时间 | System.Math.hpp 数学函数 | 其他数据类型 | VCL 基础类 | VCL 应用程序 | Pictures 图片 | Graphics 绘图 | Additional 控件 | System 控件 | A ~ Z 字母顺序排列的目录 | 网友留言/技术支持 |
|
_status87, _statusfp - 获取 x87 (x86 的浮点内核) 浮点数状态字 |
_status87, _statusfp:获取 x87 (x86 的浮点内核) 浮点数状态字
函数原型:
unsigned int _status87(void); |
#define _statusfp _status87 |
头文件:
#include <cfloat>
命名空间:
std
参数:
无
返回值:
SW_INVALID |
0x0001 |
不合理的运算 (Invalid operation),例如 0.0 除以 0.0 就是不合理的运算,无法计算出结果。 |
SW_DENORMAL |
0x0002 |
次正常 (Denormalized operand):有效数字向下溢出一部分,可以使用精度不足的浮点数来表示运算结果【注】 |
SW_ZERODIVIDE |
0x0004 |
被零除 (Zero divide),不等于零的数值除以零 |
SW_OVERFLOW |
0x0008 |
向上溢出 (Overflow),绝对值太大,超过了浮点数能够表达的范围【注】 |
SW_UNDERFLOW |
0x0010 |
向下溢出 (Underflow),绝对值太小,超过了浮点数能够表达的范围【注】 |
SW_INEXACT |
0x0020 |
降低精度 (Precision (Inexact result)),例如把 double 赋值给 float,降低了精度【注】 |
SW_STACKFAULT |
0x0040 |
栈错误 (Stack fault),计算时栈产生了溢出 |
例子:
void TForm1::ShowFpStatus(void)
{
UnicodeString s;
unsigned int fp_status = _status87();
s.cat_sprintf(L"状态字 = 0x%04X", fp_status);
if(fp_status & SW_INVALID )s += L",不合理的运算";
if(fp_status & SW_DENORMAL )s += L",次正常";
if(fp_status & SW_ZERODIVIDE)s += L",被零除";
if(fp_status & SW_OVERFLOW )s += L",向上溢出";
if(fp_status & SW_UNDERFLOW )s += L",向下溢出";
if(fp_status & SW_INEXACT )s += L",降低精度";
if(fp_status & SW_STACKFAULT)s += L",栈错误";
Memo1->Lines->Add(s);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
double big_value = 1e-40;
float short_value;
ShowFpStatus(); // 显示默认的状态字
short_value = big_value; // 降低精度
ShowFpStatus(); // 显示状态字
_clear87(); // 清除状态字
ShowFpStatus(); // 显示状态字
big_value = short_value; // 1e-40 对于 float 来说是次正常,所以得到的是次正常的值
ShowFpStatus(); // 显示状态字
}
//--------------------------------------------------------------------------- |
兼容性:
相关链接:
• _clear87 • _status87 • _control87 • _fpreset • _matherr • 浮点数异常处理
|
|
|
|