写出float x 与“零值”比较的if语句——一道面试题分析

***************************************************

更多精彩,欢迎进入:http://shop115376623.taobao.com

***************************************************


写出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


为什么浮点数不能直接作“等值比较”?
在以前看书或看文章就知道有这件事了。知道是因为“精度”,但一直没有真正想过问题的严重性。
今天在易自考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?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/458905.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Conditional project or library reference in Visual Studio

Conditional project or library reference in Visual Studio In case you were wondering why you haven’t heard from me in a while, I’ve been busy, which isn’t really of much importance unless you know me on a personal level. What is relevant is that I recen…

linux 双mipi摄像头,VS-RK3399 在linux系统下面调试Mipi camera接口介绍

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼debian系统目前支持Usb camera是没有问题&#xff0c;走UVC功能接口。那么mipi 接口camera和并口接口的camera&#xff0c;在Debian系统怎么设置呢&#xff0c;其实原理一样&#xff0c;也走uvc接口封装函数.下面深圳视壮给大家简单…

HTTP必知必会

2019独角兽企业重金招聘Python工程师标准>>> HTTP消息HTTP请求消息HTTP响应消息消息首行请求行响应行消息头部请求头请求头消息正文请求正文响应正文Web服务器把接收到的HTTP请求消息封装成request对象&#xff0c;作为service的参数传入service函数&#xff0c;ser…

float数据在计算机内存中的存储方法

*************************************************** 更多精彩&#xff0c;欢迎进入&#xff1a;http://shop115376623.taobao.com *************************************************** 浮点型变量在计算机内存中占用4字节&#xff08;Byte&#xff09;,即32-bit。遵循IEEE…

Geometric Shapes - POJ 3449(多边形相交)

题目大意&#xff1a;给一些几何图形的编号&#xff0c;求出来这些图形都和那些相交。分析&#xff1a;输入的正方形对角线上的两个点&#xff0c;所以需要求出来另外两个点&#xff0c;公式是&#xff1a;x2:(x1x3y3-y1)/2; y2:(y1y3x1-x3)/2;x4:(x1x3-y3y1)/2; y4:(y1y3-x1x3…

更新10_linux,时隔十年,QQ更新了Linux版本

昨天1024程序员节&#xff0c;QQ悄悄地更新了QQ for Linux&#xff0c;也许是给各位一个惊喜吧。官网及其的简陋。和一个Word文档似的。十年一更&#xff0c;有网友称&#xff0c;瞬间回到QQ2006&#xff0c;确实界面功能有些落后&#xff0c;相信QQ可以跟上潮流的&#xff0c;…

[渗透测试]扫目录,Sqlmap利用均超时,利用dirb扫描

今天碰到一个网友传来的Webshell地址&#xff0c;问我对方如何取得webshell。 网站为阿里云服务器&#xff0c;存在明显的注入漏洞&#xff0c;但是任何语句都会令网页报错&#xff0c;sqlmap一直超时&#xff0c;御剑扫描目录1个线程也会导致被屏蔽IP。 经一学长提点&#xff…

x = x+1,x+=1,x++那个的执行效率高

*************************************************** 更多精彩&#xff0c;欢迎进入&#xff1a;http://shop115376623.taobao.com *************************************************** x x1的效率最低 1&#xff09;读取右边x的地址 2&#xff09;执行x13&#xff09;读…

修正线性单元(Rectified linear unit,ReLU)

修正线性单元&#xff08;Rectified linear unit&#xff0c;ReLU&#xff09; Rectified linear unit 在神经网络中&#xff0c;常用到的激活函数有sigmoid函数f(x)11exp(−x)、双曲正切函数f(x)tanh(x)&#xff0c;今天要说的是另外一种activation function&#xff0c;recti…

C语言综合期末作业,内蒙古农业大学2010年期末c语言综合作业.doc

内蒙古农业大学2010年期末c语言综合作业综合练习作业#includeint main(void){int choice,i;void shuai();void ge();void wang();void bing();for(i1;i<5;i){printf("[1]统计字符个数\n");printf("[2]判断素数\n");printf("[3]求斐波那契数列\n&qu…

链表创建、逆置、删除详解

*************************************************** 更多精彩&#xff0c;欢迎进入&#xff1a;http://shop115376623.taobao.com *************************************************** 对链表的理解&#xff1a;http://www.nowamagic.net/librarys/veda/detail/2220 #inc…

python与shell的3种交互方式介绍

【目录】 1.os.system(cmd) 2.os.popen(cmd) 3.利用subprocess模块 4.subprocessor模块进阶 【概述】 考虑这样一个问题&#xff0c;有hello.py脚本&#xff0c;输出”hello, world!”&#xff1b;有testinput.py脚本&#xff0c;等待用户输入&#xff0c;然后打印用户输入的数…

C语言里if语句变量作为判断条件,C语言教学(九-上)if else判断语句

原标题&#xff1a;C语言教学(九-上)if else判断语句今天讲if else判断语句&#xff0c;简单理解就是进行条件判断&#xff0c;如果条件达到则执行if 里或else里的语句。先来看if。if的写法和for差不多,就是不用括号里的两个分号&#xff0c;if (条件) { }&#xff0c;if加括号…

const修饰指针和引用的用法【转贴】

*************************************************** 更多精彩&#xff0c;欢迎进入&#xff1a;http://shop115376623.taobao.com *************************************************** const修饰的指针会额外的占内存吗&#xff1f; 仍然是4&#xff0c;不会占额外的…

调整linux系统时区

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 好吧&#xff0c;使用tzselect又靠谱些&#xff0c;使用前把/etc/localtime删除了。 执行上前那个告诉我文件重新了&#xff0c;所以就没有搞了转载于:https://www.cnblogs.com/hark0623/p/4807426.html

stm32c语言设计以及注释,13个基于STM32的经典项目设计实例,全套资料~-嵌入式系统-与非网...

STM32单片机现已火遍大江南北&#xff0c;各种教程资料也是遍布各大网站论坛&#xff0c;可谓一抓一大把&#xff0c;但大部分都差不多。今天总结了几篇电路城上关于STM32 的制作&#xff0c;不能说每篇都是经典&#xff0c;但都是在其他地方找不到的&#xff0c;很有学习参考意…

memcpy,strcpy,strncpy

*************************************************** 更多精彩&#xff0c;欢迎进入&#xff1a;http://shop115376623.taobao.com *************************************************** memcpy c和c使用的内存拷贝函数.从源src所指的内存地址的起始位置开始拷贝n个字节…

二维数组联通子数组和最大

题目要求&#xff1a; 返回一个二维整数数组中最大联通子数组的和。输入一个二维整形数组&#xff0c;数组里有正数也有负数。文件输出。思路:和之前的动态规划相识&#xff0c;把二维数组转换为一维数组&#xff0c;先求每一个列的子数组和最大&#xff0c;最后在用正数就加&a…

c语言如何给变量加锁,C语言互斥锁-条件变量实现公共缓存区数据读写

#include char buffer[128];int has_data0;pthread_mutex_t mutex;pthread_cond_t cond;pthread_cond_t cond2;void read_buf(void){do{pthread_mutex_lock(&mutex);//锁定互斥锁if(has_data0){/*阻塞线程,等待另外一个线程发送信号&#xff0c;同时为公共数据区解锁*/pthr…

view-activity跟控件在onkey事件上的传递关系

android 中Activity跟View对于键盘的监听&#xff0c;主要有以下几个方法 //按键按下 public boolean onKeyDown(int keyCode, KeyEvent event) {} //按键弹起 public boolean onKeyUp(int keyCode, KeyEvent event) {} //常按 public boolean onKeyLongPress(int keyCode, Ke…