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));
} |
运行结果:
浮点数常数类型测试
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 |
|
|
|
|