c语言浮点数绝对值,单精度浮点数
c标准库3354浮点数-chenwu 128-博客花园
c标准库3354浮点数
浮点数格式
当我学习C时,我知道浮点数的表达方式类似于科学计数。具体的浮点数模型是:
尾数、基数、指数和符号表示。
比百度深一点,在标准化的表格里(没错,还有非标准化的表格),可以在一个表格里列出float和double的表示格式:
类型
存储位数
不正常的
位
指数位
最后一位数字(m)
总位数
十六进制的
十进制
单精度浮点
1位
8位
23位
32位
0x7FH
127
双精度
1位
1位
52位
64位
0x3FFH
1023
但是有些细节不得不说:
基数————这个基数可以由用户自定义。一般是2,但也有可能取10,16。如何指定?
宏FLT基数在头文件float.h中定义,其值是所选的基数。
尾数————这是一个定点十进制数,存储在原码中。尾数的最左端意味着1,这意味着所有23位都用于
表示十进制数,而实际表示的数字是24位精度。
Index ————这当然是一个整数,但是是通过代码移位来存储的。为了处理负指数的情况,应该加上实际的指数值
偏移值被用作保存的值(float是127;双1023)。对于单精度浮点,有效
索引范围为-126~127(保存的值为1~254,因为两个端点值被用作特殊值)。
IEEE 754定义了什么?
说到浮点数,这个标准是不能忽略的。那么这个标准的主要条款是什么呢?
一、浮点数格式:
除了上面提到的两种基本浮点格式,还定义了这两种格式的扩展。
但是该标准只规定了扩展格式的最小精度和大小。例如,IEEE双精度扩展格式必须至少有
有64个有效数字,它们总共至少占据79个数字。
b、四种浮点数舍入方法:
舍入到最接近的值:将结果舍入到最接近的可表示值(默认)。以这种方式,采用舍入到偶数,
不像大家熟悉的‘四舍五入’。这主要是处理中位数(两个相邻整数的平均值)。如果这些值都遵循“五进制”,
那么在数值计算中就会积累很大的误差。也就是说,——— 0.5要四舍五入到0,1.5要输入2 ———保证50%的概率。
向方向舍入:向正无穷大方向(向上)舍入结果。
向-方向舍入:向负无穷大方向(向下)舍入结果。
舍入到0:将结果舍入到0。忽略小数部分。
这些舍入方法可以由宏FLT-float . h中的舍入来指定
C.五个浮点异常:
无效操作:默认情况下返回NaN(如对负数求平方)
除以零:默认情况下返回负无穷大或正无穷大。
溢出:默认情况下,它返回正负无穷大(当结果数据太大而无法表示时)。
下溢:默认返回非标准数(当结果数据太小而无法表示时)。
不准确:默认情况下返回正确的舍入值。
如果发生异常,会影响异常向量表,有的甚至会造成中断。至于中断,异常处理当然不是本文要讨论的内容。
D.特殊值:(还记得指数部分没有用到的两个端点吗?)
nan(非数字):对于单精度浮点数,NaN表示为指数为128(保存值=255)且尾数不等于零的浮点数。
:这个数的定义和NaN一样,但它的尾数必须是0。(用于范围较大的数字)
0:对于单精度,0表示指数字段为-127(保存值=0),尾数字段全为0。
非规格化数:该数的定义与有符号0的定义相同,但尾数不能为0。(用于超出范围的数字)
当然,这个标准规范里的东西还不止这些,对运算精度,不同类型数据之间的转换,不同二进制数据之间的转换等等也有一些要求。
其实我们这里说的是最老的浮点标准,应该还有几个新标准。最好的信息当然是这些标准的文档。有时间的话,仔细看看也不错。
文件float.h
一开始很多处理器在硬件上不支持浮点运算,因为这样会增加很多成本。不支持浮点运算会使微处理器
设计的复杂性减半。由于科学计算等一些高精度运算的需要,需要浮点运算。
当然,文件float.h的结构也要遵循这个标准,但是这个头文件里并没有太多。除了前面提到的两个宏之外,
这个头文件还定义了一些关于浮点数范围的宏。
其实知道这个库也没什么特别的原因。毕竟,即使是数值计算算法,你也可以用MATLAB这个强硬的工具。
不过知道了这个头文件之后,就很容易看出limits.h有一个约定的整数范围。
不过这仅限于了解这个库,如何实现是另一个问题。
参考文章:定点数和浮点数的区别。(文章不错,虽然有一些小错误)
分类:C/C
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。