写出float  x 与“零值”比较的if语句

请写出 float  x 与“零值”比较的 if 语句:
const float EPSINON = 0.00001;
if ((x >= - EPSINON) && (x <= EPSINON)
不可将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”此类形式。

EPSINON
应该是一个很小的值吧   因为计算机在处理浮点数的时候是有误差的,所以判断两个浮点数是不是相同,是要判断是不是落在同一个区间的,这个区间就是  
[-EPSINON,EPSINON]   EPSINON一般很小,10的-6次方以下吧,具体的好像不确定的,和机器有关

出处:http://topic.csdn.net/t/20041126/10/3590118.html

[结论]
浮点数等值比较使用下式:
#include
#include
fabs(a - b) < FLT_EPSILON

三个EPSILON:
FLT_EPSILON
DBL_EPSILON
LDBL_EPSILON
注意:#define FLT_EPSILON     1.192092896e-07F,这个值非常小,如果你的应用里实际精确不到这么小,那么就不应该直接用这个,而应该自己定义一个

比如,#define EPSINON 1e-6

为什么浮点数不能直接作“等值比较”?
在以前看书或看文章就知道有这件事了。知道是因为“精度”,但一直没有真正想过问题的严重性。
今天在易自考www.ezikao.com.cn看到一个帖子,顺便搜索了一下,测试结果让我信服了这条规则:
易自考帖子:http://www.ezikao.com.cn/bbs_disp.asp?boardid=47&id=79506

以下内容引用自林锐《高质量C/C++代码编写指南》

4.3.3 浮点变量与零值比较
? 【规则4-3-3】不可将浮点变量用“==”或“!=”与任何数字比较。
千万要留意,无论是float还是double类型的变量,都有精度限制。所以一定要避免将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”形式。
假设浮点变量的名字为x,应当将
if (x == 0.0) // 隐含错误的比较
转化为
if ((x>=-EPSINON) && (x<=EPSINON))
其中EPSINON是允许的误差(即精度)。

最好定义一个符号常量来做。#define EPSINON 1e-6

我想是因为浮点数表示范围大,如果一个数已经很小的时候,就可以认为是0了,epsinon嘛,limit,极限什么的。
也可以想一下,0.9无限循环不是等于1吗?
如果正好某个值等于0.9循环,浮点数只能给出一个“确定”的值,那就会“做错题”。

我想原理大约是这样的。具体的嘛,我还没有弄清楚 :)

再经过搜索后,写下如下一段话:

好了,终于找到不完整的答案了。反正我是绝不会再将浮点数直接比较了:
参见帖子:http://blog.joycode.com/joe/archive/2004/12/07/40592.aspx

我参照这篇文章写了这个例子:
#include <stdio.h>
#include <stdlib.h>

main()
{
    float d1, d2, d3, d4;

d1 = 194268.02;
    d2 = 194268;
    d4 = 0.02;
   
    d3 = d1 - d2;
    if (d3 > d4)
       printf(">0.02/n");
    else if (d3 < d4)
       printf("<0.02/n");
    else
       printf("=0.02/n");

printf("%f - %f = %f /n", d1,d2,d3);

system("pause");
}

请看结果:
<0.02
194268.015625 - 194268.000000 = 0.015625

即:194268.02 - 194268.0 不等于 0.02!
存进去的数居然会变!怕了吧?

4个变量改成double型的,再测试:
这是结果
<0.02
194268.020000 - 194268.000000 = 0.020000
明明是0.02啊,怎么还是小于?
这次没有改我存的数了吧?WHY?

我说,我怕了,以后我再不敢用浮点数直接作相等比较了!

还是那句话:浮点数都是有精度限制的。
所以你存的数,不一定就是你要的数。

虽然这件事很值得郁闷,不过我还是很高兴又知道了点东西。

2005.10.10 晚继续更新
关于EPSINON,可不是能随便定义的!
而且应该能想到,double和float的EPSINON是不同的。
定义成什么呢?不必你去定义了,ANSI C已经定义了这些常量:
载入头文件
#include
就可以引用

FLT_EPSILON
DBL_EPSILON
LDBL_EPSILON

几个常量了。

出处:http://hi.baidu.com/ecgql/blog/item/fde8d617c496f50ec83d6d7a.html?

写出float x 与“零值”比较的if语句——一道面试题分析的更多相关文章

  1. float 浮点数与零值0比较大小

    float x: 千万不要写x==0; 写出float x 与“零值”比较的if语句——一道面试题分析 写出float  x 与“零值”比较的if语句 请写出 float  x 与“零值”比较的 if ...

  2. float 浮点数与零值0比较大小 ZZ

    float x: 千万不要写x==0; 写出float x 与“零值”比较的if语句——一道面试题分析 写出float  x 与“零值”比较的if语句 请写出 float  x 与“零值”比较的 if ...

  3. 零值比较--BOOL,int,float,指针变量与零值比较的if语句

    这是程序员面试的一道常见题,也是个C++基础问题.若只在大学里看过几本基础的编程入门书,看见这道题可能会觉得奇怪,不就是和0比较吗,直接拿出来比就是了,其实非也.下文引自google搜索结果,出处不详 ...

  4. 浮点数比较问题(float x 与 '零值'比较)

    今天在牛客网上看到一道面试题,看完之后着实吃了一惊,自己平常都没有在意,看似简单的问题,实则考验了语言的基本功. 据说这是腾讯的面试题: float x 与“零值”比较的if语句为? if (x == ...

  5. BOOL,int,float,指针变量 与“零值”比较的if语句

    分别给出BOOL,int,float,指针变量 与“零值”比较的 if 语句(假设变量名为var) 解答: BOOL型变量:if(!var) int型变量: if(var==0) float型变量: ...

  6. 写出bool,int,float,指针与零值比较的if语句

    这个里面float与零值的比较颇有些意思. bool: bool flag; if (flag == true) return; int: int var; if (var == 0) { retur ...

  7. BOOL,int,float,指针变量与零值比较的if语句

    1.注意这里说的是,与零值比较,而不是与零比较. 2.对于int类型,与零值比较就是: if(var == 0) //零值 3.对于bool类型,零值表示false,任何非零值表示true,因此使用: ...

  8. 分别给出BOOL,int,float,指针变量 与“零值”比较的 if 语句(假设变量名为var)

    BOOL型变量:if(!var)    int型变量: if(var==0)    float型变量:    const float EPSINON = 0.00001;    if ((x > ...

  9. fir.im Weekly - 如何写出零 bug 的代码

    神兽护体,代码无bug.经常看到代码注释的各种形状,这是一种程序员情怀.那么,如何能写出零 Bug 的代码呢,来看看@码农翻身 的这篇手册--零Bug的代码是怎么炼成的. 写零 Bug 一定少不了代码 ...

随机推荐

  1. linux查看系统的一些版本号指令

    1.查看系统 [root@iZbp1eoiap1e1jb6pvo390Z ~]# lsb_release -a LSB Version: :core-4.1-amd64:core-4.1-noarch ...

  2. Java基础学习笔记(三) - 抽象类和接口

    一.抽象类 没有方法主体的方法称为抽象方法,包含抽象方法的类就是抽象类. Java中使用 abstract 关键字修饰方法和类,抽象方法只有一个方法名,没有方法体. public abstract c ...

  3. Springboot + Mysql8实现读写分离

    在实际的生产环境中,为了确保数据库的稳定性,我们一般会给数据库配置双机热备机制,这样在master数据库崩溃后,slave数据库可以立即切换成主数据库,通过主从复制的方式将数据从主库同步至从库,在业务 ...

  4. Nginx常用命令,解决你日常运维的烦恼

    前面,跟大家简单地介绍了负载均衡和Nginx的一些基础配置(Nginx负载均衡配置实例),接下来,跟大家介绍一下Nginx的常用命令,便于日常的运维. 查看原文 停止Nginx的方法 通过之前的学习, ...

  5. day 23

    目录 面向对象总复习 面向对象总复习 面向过程编程思想: ​ 核心是过程,过程指的是做事情的步骤,即先干什么再干什么. ​ 基于该编程思想编程,就好比一条流水线,一种机械式的思维方式. 面向对象编程思 ...

  6. python编程基础之十六

    for in 循环,与其说是循环不如说精确点交遍历 for 变量名 in + 迭代对象 语句A else: 语句B 作用:一次访问迭代对象中的元素并赋值给变量 循环终止时,执行else语句块,如果br ...

  7. .net core运用application/x-www-form-urlencoded发起post请求

    通常情况下都是使用 application/json发起post请求,但是有的.net 接口只接收 application/x-www-form-urlencoded 例如: { name:" ...

  8. Python flask 构建微电影视频网站☝☝☝

    Python flask 构建微电影视频网站☝☝☝ 1.安装数据库连接依赖包 pip install flask-sqlalchemy 2.创建movie数据库 在CentOS虚拟机,进入MaridD ...

  9. python selenium下拉框定位

    一.前言 总结一下python+selenium select下拉选择框定位处理的两种方式,以备后续使用时查询: 二.直接定位(XPath) 使用Firebug找到需要定位到的元素,直接右键复制XPa ...

  10. 构造函数语义学——Copy Constructor 篇

    构造函数语义学--Copy Constructor 篇 本文主要介绍<深度探索 C++对象模型>之<构造函数语义学>中的 Copy Constructor 构造函数的调用时机 ...