主页C++ Builder 资料C++ Builder 参考手册cfloat 浮点数浮点数类型
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 字母顺序排列的目录
网友留言/技术支持
float, double, long double - 浮点数类型

C++ Builder 可用的浮点数类型

标准 C 语言
数据类型
VCL/FMX
数据类型
Windows API
数据类型
取值范围 字节数 位数 说明
float Single FLOAT 1.18×10-38 ~ 3.40×10E+38 4 32 单精度浮点数,32 位 IEEE 浮点数
double Double DOUBLE 2.23×10-308 ~ 1.79×10+308 8 64 双精度浮点数,64 位 IEEE 浮点数
long double Extended   2.23×10-308 ~ 1.79×10+308

3.37×10-4932 ~ 1.18×10+4932
8 或 10 64 或 80 长双精度浮点数,精度不低于双精度的浮点数。
64 位 Windows: 64 位 IEEE 浮点数
32/16 位 Windows/DOS: 80 位 IEEE 浮点数
float * PSingle         单精度浮点数指针
double * PDouble         双精度浮点数指针
long double * PExtended         长双精度浮点数指针

 

浮点数常数

在 C/C++ 里面,常数根据后缀判断类型,例如 0 为 int 类型,0.0 为 double 类型,0.0f 为 float 类型。

浮点数常数后缀 浮点数类型 说明
double 双精度浮点数,例如 0.0, 26.0, 0.128
f 或 F float 单精度浮点数,例如 0.0f, 26.0f, 0.128f
l 或 L long double 长双精度浮点数,例如 0.0l, 26.0l, 0.128l

 

特殊浮点数值

浮点数值 常数值
#include <System.Math.hpp>
名称 说明
+INF Infinity 正无穷大 (+∞, +infinity) 大于零的浮点数除以零,或者计算溢出,超出浮点数正数的表示范围
-INF NegInfinity 负无穷大 (-∞, -infinity) 小于零的浮点数除以零,或者计算溢出,超出浮点数负数的表示范围
NAN NaN 不是数 (not a number) 无法计算的结果,例如浮点数零除以零,或者负数求平方根等

 

判断浮点数是否为实数,即 -∞ < 数值 < +∞

使用 std::_finite(f) 或 std::_finitel(f) 判断浮点数 f 是否为实数,头文件为 #include <cfloat>
返回值:当 -∞ < f < +∞ 时,返回值为 true,当 f 为 +INF、-INF 或 NAN 是,函数返回 false。

 

特殊浮点数测试

#include <System.Math.hpp>
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
  SetExceptionMask(exAllArithmeticExceptions);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  double a =  1.0;
  double b = -1.0;
  double c =  0.0;

  double x = a / c;
  double y = b / c;
  double z = c / c;

  Memo1->Lines->Add(L"x = " + FloatToStr(x));
  Memo1->Lines->Add(L"y = " + FloatToStr(y));
  Memo1->Lines->Add(L"z = " + FloatToStr(z));
}

运行结果:

x = INF
y = -INF
z = NAN

 

浮点数常数类型测试

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  Memo1->Lines->Add(typeid(3    ).name());
  Memo1->Lines->Add(typeid(3.0f ).name());
  Memo1->Lines->Add(typeid(3.0l ).name());
  Memo1->Lines->Add(typeid(3.0  ).name());
  Memo1->Lines->Add(typeid(2/3.0).name());
}

运行结果:

int
float
long double
double
double

 

下一页:浮点数异常处理

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