float型与0的比较.doc_第1页
float型与0的比较.doc_第2页
float型与0的比较.doc_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

前一段时间读了一下林锐博士的高质量 C/C+ 编程指南,其中有一个比较经典的问题。请写出 float x 与“零值”比较的 if 语句? 当时只知道不能直接用 float 类型的值与 0 进行“ = ”或“ != ”比较,但不知道该具体怎么写这个 if 语句。看过答案才知道,应该设法转化成“ = ”或“ = - EPSINON) & (x = EPSINON) 看了答案后觉得很有道理,然后就记了答案,算是取得了“真经”了。 最近,我和项目组同事讨论问题的时候,正好涉及到这个问题。我马上想到自己的“真经”,炫耀地说出了标准答案,可同事问了句为什么,为什么是 0.00001 ?我马上哑炮了。终于体会那句话,凡事认真追问起来,都不简单。 事情要知其然,还要知其所以然。马上编了个小程序验证了一把。 #include int main() float f = 1.0; float f1 = f/3;/ f1 = 1/3 float f2 = f1*3; / f2 = 1; float f_result = f1 - f2/3; / f_result = 0 ? if(0.0f = f_result) printf(f_result = 0/n); else printf(f_result != 0/n); return 0; 通过上述程序,可以明确得到答案,但具体为什么如此,还需要从 C 语言中 float 类型变量的编码格式说起。 浮点数表示形如 V=x * 2y 的有理数进行编码, IEEE 标准 754 仔细制定了浮点数及其运算的标准。 十进制的 12.34 可以这样表示: 1*101 + 2*100 + 3*10-1 + 4*10-2 。同样地,二进制的 101.11 可以这样表示: 1*22 + 1*20 + 1*2-1 +1*2-2 。注意而今之中形如 0.1111 正好是小于 1 的数。假定只用有限长度的编码,那么十进制是不能准确表示想 1/3 、 5/7 这样的数的,类似的,小数的二进制表示法只能表示那些能够被写成 x * 2y 的数,其他的只能用近似数来表示。 IEEE 浮点标准用 V=(-1)s * M * 2E 的形式来表示一个数: ( 1 )符号( sign ) s 决定数是负数( s=1 )还是正数( s=0 ),而对 0 的符号位作为特殊情况处理。 ( 2 )有效数( significant ) M 是一个二进制小数。 ( 3 )指数( exponent ) E 是 2 的幂(可能是负数),他的作用是对浮点数的加权。 一个浮点数的位表示按上述情形划分为 3 个域。 标准 C 语言中,单精度 float 浮点格式的符号位 =1 ,有效位 =23 ,指数未 =8 ,产生一个 32 位的表示。双精度 double 浮点格式的符号位 =1 ,有效位 =52 ,指数位 =11 ,产生一个 64 位的表示。 根据指数位的值,被编码的值可以分为三种不同的情况,即,规格化值、非规格化值、特殊数值。当指数的为不全为 0 且不全为 1 时,属于规格化值;当指数位全为 0 时,属于非规格化值;当指数位全为 1 时,属于特殊数值。下面主要了解一下后两者情况。 非规格化值有两个目的。首先提供了一种表示数值 0 的方法当小数位也全为 0 时,可以根据符号位的不同表示 +0.0 和 -0.0 。另外一个功能是用来表示那些非常接近 0.0 的数,使用逐渐下溢出( gradual underflow )的方法实现这个属性。特殊数值当指数位全为 1 ,而小数位全为 0 时,可以表示正无穷大和负无穷大。当小数位为非零时,结果值被称为 NaN 。 因为表示方法限制了浮点数的范围和精度,所以浮点运算只能近似地表示实数运算。系

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论