主页C++ Builder 资料C++ Builder 参考手册cfloat 浮点数_status87, _statusfp
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();          // 显示状态字
}
//---------------------------------------------------------------------------

兼容性:

函数 \ C++ Builder 编译器 bcc32 clang32 clang64
_status87  
_statusfp  

相关链接:

_clear87_status87_control87_fpreset_matherr浮点数异常处理

◤上一页:_control87, _controlfp下一页:_fpreset

C++ 爱好者 -- Victor Chen 的个人网站 www.cppfans.com 辽ICP备11016859号