Vdsp(bf561)中的浮点运算(5):float类型表示总结
可以知道,要取最大值,可以将指数和尾数都设置为最大值,由于标准规定将指数全为1留做特殊表示,故指数最大值为255,这个数即
0 11111110 11111111111111111111111 符号位 指数 尾数 从16进制整数看它的值就是 0x7f 7f ff ff。 根据浮点数的计算公式可知这个值为: 1. 9999997615814208984375 * 2(254-127) = 3.4028234663852886E+38 这个是计算器的计算结果。 1.4 FLT_EPSILON FLT_EPSILON是在float.h中定义的一个常量,用以表示一个单精度浮点数的最小分辨率,文档对此值的描述是: A constant that represents the smallest value that may added to 1.0 and still result in a change of value (for example, FLT_EPSILON) 也就是加1后要能看得出变化! FLT_EPSILON定义为: #define FLT_EPSILON 1.1920928955078125E-07F 那么这个值从何而来? 先看1.0的浮点表示: 0 01111111 00000000000000000000000 符号位 指数 尾数 从十六进制的角度看就是0x3f80 0000 要想把这个值加上一个足够小的值但仍然能看出变化,当然就是把尾数直接加1,这个数即2-23,转换成十进制就是FLT_EPSILON的值。 下面是一个很有意思的问题: float a = FLT_EPSILON; 这个时候a的值会是什么? 在VDSP下试了一下,a的值看成整数是:0x3400 0000,也就是: 0 01101000 00000000000000000000000 符号位 指数 尾数 即1.0 x 2(104-127) = 1.0 x 2-23 1.5 INF和NAN IEEE754规定了单精度浮点数的类型:
INF的表示要求指数为255,尾数为0,即: 0 11111111 00000000000000000000000 符号位 指数 尾数 也就是0x7f80 0000。 在VDSP下可以用: float a = 1.0 / 0.0; 来生成一个INF的数。 当然,符号位也可以取负数,即: 1 11111111 00000000000000000000000 符号位 指数 尾数 也就是0xff80 0000。 在VDSP下可以用: float a = -1.0 / 0.0; 来生成一个-INF的数。 上述两个INF都可以用isinf函数来检测它。 NAN的表示要求指数为255,尾数不为0,即: 0 11111111 00000000000000000000001 符号位 指数 尾数(可取任意不为0的值) 也就是0x7f80 0001这样的数。 在VDSP下可以用: float a = 0.0 / 0.0; 来生成一个NAN的数,不过这个时候它的值为0xffff ffff。 可以使用isnan函数来检测它。 |
||||||||||||||||||||
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |