C语言 "float.h" 浮点数设定
Posted 匆忙拥挤repeat
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言 "float.h" 浮点数设定相关的知识,希望对你有一定的参考价值。
文章目录
float.h 说明
浮点数在内存中以科学计数法的形式来存储,具体形式为:
flt = $ (-1)^sign × mantissa × base^exponent $
- flt 是要表示的浮点数。
- sign 用来表示 flt 的正负号,它的取值只能是 0 或 1:取值为 0 表示 flt 是正数,取值为 1 表示 flt 是负数。
- base 是基数,或者说进制,它的取值大于等于 2(例如,2 表示二进制、10 表示十进制、16 表示十六进制……)。
- mantissa 为尾数,或者说精度,是 base 进制的小数,并且 1 ≤ mantissa < base,这意味着,小数点前面只能有一位数字。
- exponent 为指数,是一个整数,可正可负,并且为了直观一般采用十进制表示。
float.h
中,定义了一些系统中浮点数设定的相关的宏。
宏的前缀:
- FLT 是指类型 float
- DBL 是指类型 double
- LDBL 是指类型 long double。
相关的宏设定
#include <float.h>
#include <stdio.h>
void float_test()
#define pi(no, n) printf("%s %d\\n", no, n) //输出整数
#define pe(no, n) printf("%s %.5e\\n", no, n) //浮点数,科学记数法,小数位5位有效数字
#define ple(no, n) printf("%s %.5Le\\n", no, n) //科学记数法,小数位5位有效数字。 long double
/*
* 定义浮点加法的舍入模式,它可以是下列任何一个值:
* -1 - 无法确定
* 0 - 趋向于零
* 1 - 舍入到最接近的值。如对1.55保留1位精度, 是1.6;而 -1.55 是-1.5
* 2 - 趋向于正无穷,向上舍入
* 3 - 趋向于负无穷,向下舍入
*/
pi("a.", FLT_ROUNDS);
pi("b.", FLT_RADIX); //这个宏定义了指数表示的基数。基数 2 表示二进制,基数 10 表示十进制,基数 16 表示十六进制。一般为 2
pi("c.", FLT_MANT_DIG); //float. 这三个宏定义了 基数(进制)为 FLT_RADIX 时,尾数 mantissa 的最大位数,注意,这里所说的长度包含了整数部分和小数部分。
pi("d.", DBL_MANT_DIG); //double
pi("e.", LDBL_MANT_DIG); //long double
pi("f.", FLT_DIG); //float. 转换成十进制形式后,小数点后精确数字(能够保证精度的数字)的位数
pi("g.", DBL_DIG); //double.
pi("h.", LDBL_DIG); //long double.
pi("i.", FLT_MIN_EXP); //float. 基数(进制)为 FLT_RADIX 时,规格化浮点数的指数(也即 exponent)的最小值(为负数)。
pi("j.", DBL_MIN_EXP); //double.
pi("k.", LDBL_MIN_EXP); //long double.
pi("l.", FLT_MIN_10_EXP); //float. 转换成十进制形式后,规格化浮点数的指数的最小值(为负数)。
pi("m.", DBL_MIN_10_EXP); //double.
pi("n.", LDBL_MIN_10_EXP); //long double.
pi("o.", FLT_MAX_EXP); //float. 基数(进制)为 FLT_RADIX 时,规格化浮点数的指数(也即 exponent)的最大值(为正数)。
pi("p.", DBL_MAX_EXP); //double.
pi("q.", LDBL_MAX_EXP); //long double.
pi("r.", FLT_MAX_10_EXP); //float. 转换成十进制形式后,规格化浮点数的指数的最大值(为正数)。
pi("s.", DBL_MAX_10_EXP); //double.
pi("t.", LDBL_MAX_10_EXP); //long double.
pe("u.", FLT_MAX); //float. 最大的有效浮点数的值(为正数),即浮点数的最大值。 正数
pe("v.", DBL_MAX); //double.
ple("w. ", LDBL_MAX); //long double.
pe("x. ", FLT_EPSILON); //float. 1 和大于 1 的最小浮点数之间的差值。 为负数
pe("y. ", DBL_EPSILON); //double.
ple("z. ", LDBL_EPSILON); //long double.
pe("a. ", FLT_MIN); //float. 最小的有效浮点数的值(为负数),即浮点数的最小值。负数
pe("b. ", DBL_MIN); //double.
ple("c. ", LDBL_MIN); //long double.
pe("d. ", FLT_MIN); //float. 最小的有效浮点数的值(为负数),即浮点数的最小值。负数
pe("e. ", DBL_MIN); //double.
ple("f. ", LDBL_MIN); //long double.
/*
* 指明在表达式求值(尤其是数学运算)过程中是否需要提升浮点数的类型,可能的取值有:
* -1:未知的,不确定的。
* 0:不提升类型,使用当前的类型。
* 1:将浮点数提升到 double 类型,大于等于 double 类型的保持不变;也就是说,将 float 类型提升为 double 类型,double 和 long double 类型不变。
* 2:将浮点数提升到 long double;也就是说,将 float、double 提升到 long double 类型,long double 类型保持不变。
*/
pi("g. ", FLT_EVAL_METHOD);
/*
* 在不损失精度精度的情况下,能够将 long double 转换成至少 DECIMAL_DIG 个十进制数字;
* 反过来,也能将至少 DECIMAL_DIG 个十进制数字转换成 long double。
* 也就是说,DECIMAL_DIG 是用于 long double 序列化和反序列化时的十进制精度。
*/
pi("h. ", DECIMAL_DIG);
本机输出(不同的系统的实现不同,这些宏的输出值有差别):
a. 1
b. 2
c. 24
d. 53
e. 64
f. 6
g. 15
h. 18
i. -125
j. -1021
k. -16381
l. -37
m. -307
n. -4931
o. 128
p. 1024
q. 16384
r. 38
s. 308
t. 4932
u. 3.40282e+38
v. 1.79769e+308
w. 1.18973e+4932
x. 1.19209e-07
y. 2.22045e-16
z. 1.08420e-19
a. 1.17549e-38
b. 2.22507e-308
c. 3.36210e-4932
d. 1.17549e-38
e. 2.22507e-308
f. 3.36210e-4932
g. 0
h. 21
以上是关于C语言 "float.h" 浮点数设定的主要内容,如果未能解决你的问题,请参考以下文章
c语言“输入一个浮点数,输出它的绝对值,保留两位小数。”求解