在c++开发中,double或者float类型判断相等性不能简单的用等于符号==进行,一般会采用如下方式进行判断

static inline bool DoubleEqual(double a, double b)
{return fabs(a - b) < std::numeric_limits<double>::epsilon();
}

为了验证这个说法,我在机器上写了如下一段代码, 结果竟然没有一次输出,貌似可以直接比较

double a = 0, b = 0;
for(int i = 0; i < 100000; i++) {a += i * 0.1;b += i * 0.1;if ( a != b) {printf("%f %f\n", a ,b);}
}

那么到底浮点数能不能比较?

#include<stdio.h>
int main()
{float x = 0.1;if (x == 0.1)printf("1");else if (x == 0.1f)printf("2");elseprintf("3");
}

这段代码输出2,这也就意味着 x == 0.1 返回了false。 x==0.1f 返回了true。这又是为什么呢?先看一段代码

#include<stdio.h>
int main()
{float x = 0.1;printf("%d %d %d", sizeof(x), sizeof(0.1), sizeof(0.1f));return 0;
}

这段代码输出 4 8 4, 这也就说明代码中不加上f后缀,默认会采用double类型(sizeof(0.1)中的0.1作为常量默认是按照double存储的)。前面的例子中 x == 0.1 导致了x 变量提升到double(因为右边的0.1是double类型,所以x要提升到double),double 位数比float要多,这时候就需要二进制补全(x进行了补全,只是把后面缺的近30位补成了0,而不是把x这个0.1重新按照double进行组织,也就是补全后的x虽然小数部分达到了52位,但是后面的29位都是0)。0.1的二进制(double)表示为(0.00011001100110011…) 后面的...表示循环数。由于float的位数(23)要小于double(52)的位数,在x变量提升到double后, 编译器会将多余的尾补全尾0。

0.00011001100110011001100 float 0.1
在和0.1比较时(0.1默认为double)时,x会被编译器进行变量提升,变成
0.00011001100110011001100000000000000000 (float 0.1 提升到double 0.1的二进制表示)
 而double类型的0.1的表示为:
0.0001100110011001100110011001100110011001100110011001(原double 0.1的二进制表示)
上述结果就得到了解释,float提升到double后的二进制表示和double 0.1的二进制完全不一样。

难道所有的比较都会有这个问题吗?并不是。下面有个例子就不会产生问题比如

#include<stdio.h>
int main()
{float x = 0.5;if (x == 0.5)printf("1");else if (x == 0.5f)printf("2");elseprintf("3");
}

这个就输出了1,

0.5的二进制表示为0.100000…, 由此看见就算编译器在尾补上补充再多的0,也不会导致二进制表示不一样。

总结
同类型的比较不设计到变量提升或者截断,可以直接比较。当变量提升或者截断后,二进制没有循环模式的也是可以直接比较的。

参考链接:https://blog.csdn.net/Sweet_Oranges/article/details/120333814

C++中float和double的比较相关推荐

  1. mysql double 存储_关于MYSQL中FLOAT和DOUBLE类型的存储-阿里云开发者社区

    关于MYSQL中FLOAT和DOUBLE类型的存储 重庆八怪 2016-04-12 844浏览量 简介: 关于MYSQL中FLOAT和DOUBLE类型的存储 其实在单精度和双精度浮点类型存储中其存储方 ...

  2. 关于MYSQL中FLOAT和DOUBLE类型的存储

    关于MYSQL中FLOAT和DOUBLE类型的存储 其实在单精度和双精度浮点类型存储中其存储方式和C/C++一致准守IEEE标准他们都是浮点型的,所谓的浮点型,是小数点的位置可变,其能够表示的范围比定 ...

  3. java中float、double和BigDecimal的精度问题(fastjson、Jackson以及实例化的方式)

    java中float.double和BigDecimal的精度问题(fastjson.Jackson以及实例化的方式): 问题描述 java中如果使用float或double类型的数据初始化BigDe ...

  4. Java中float和double精度

    http://zhidao.baidu.com/question/344295417.html?seed=0 float与double的区别 单精度浮点数在机内占4个字节,用32位二进制描述. 双精度 ...

  5. mysql中的double类型_MySQL中float、double、decimal三个浮点类型的区别与总结!

    作者:极客小俊 一个专注于web技术的80后 我不用拼过聪明人,我只需要拼过那些懒人 我就一定会超越大部分人! CSDN@极客小俊,原创文章, B站技术分享 个人博客: cnblogs.com 前端h ...

  6. java中float和double为什么会转为科学记数法?

    1.背景 在日常开发中有时会使用到float或double数据类型,然而在前端接收到数据时发现数据为科学记数法,此时不能满足业务显示直观的需求.为什么float和double会变成科学记数法格式呢?什 ...

  7. 细节:基本数据类型中float与double的区别

    一.两者定义 float:单精度浮点数 double:双精度浮点数 二.两者的主要区别 01)在内存中占有的字节数不同 单精度浮点数在机内存占4个字节 双精度浮点数在机内存占8个字节 02)有效数字位 ...

  8. java double 赋值语句_Java中float、double、long类型变量赋值添加f、d、L尾缀问题

    展开 1. 添加尾缀说明 我们知道Java在变量赋值的时候,其中float.double.long数据类型变量,需要在赋值直接量后面分别添加f或F.d或D.l或L尾缀来说明. 其中,long类型最好以 ...

  9. java中float和double型数据在赋值时有哪些注意事项?,java语言中float和double类型的数据在编程时的注意事项...

    float和double类型的数据在编程时的需要注意的地方 package execisetest; public class AccuranceTest {     public static vo ...

  10. mysql中float、double、decimal的区别

    float类型表示单精度浮点数值,double类型表示双精度浮点数值,float和double都是浮点型,而decimal是定点型: MySQL 浮点型和定点型可以用类型名称后加(M,D)来表示,M表 ...

最新文章

  1. python太阳花绘图_python中turtle如何画太阳花?
  2. 三分钟带你对 Softmax 划重点
  3. android窗口速度条,android 改变ViewPager切换页面时的速度
  4. c语言模拟java面向对象_面向对象设计模式C语言实现.PDF
  5. python调用打印机驱动下载_selenium的Python使用(一)浏览器驱动的安装及使用
  6. java有道云,有道云笔记链接——JAVA面向对象的学习
  7. 如何在Java 8中使用filter()方法
  8. mysql1130_解决远程连接mysql错误1130的方法
  9. C语言(CED)编写程序,求sum=1*1*1+2*2*2+3*3*3+4*4*4+5*5*5+····+n*n*n
  10. python抓取网站图片_利用python抓取网站图片
  11. 美妆海报不会做? PSD分层模板轻松掌握大咖思路!
  12. 检测表单是否合法,为什么不能用n++的探讨
  13. Struts2 框架
  14. python打印网页成pdf_html – 在chrome-python 2.7中自动打印/保存网页为pdf
  15. censo7安装mysql_centos7环境下在线安装mysql
  16. 英语——非谓语动词——不定式【学习笔记】
  17. linux查看是否开启审计功能,linux审计功能auditd
  18. IOS苹果手机背景音乐不能自动播放问题
  19. 预测性分析及常用预测方法
  20. 小程序真正实现多个文件上传,不通过循环调用uni.uploadFile

热门文章

  1. Worthington 蛋白质组学/蛋白酶方案
  2. 联想笔记本计算机在哪里找不到,Win10 Lenovo笔记本电脑显示找不到相机
  3. 音频帧率计算方法(只需要知道 采样率 和 一帧采样数 )
  4. 笔记本电脑频繁自动重启_电脑为何总是自动重启 电脑自动重启原因【解决方法】...
  5. 在线做题---呼叫转移系统
  6. 卡尔曼滤波原理图文详解
  7. VMWare 下 CentOS 设置静态 IP 地址
  8. 表格,表单,文本域,下拉框,单选框,复选框,按钮
  9. 双三次插值算法(bicubic interpolation)与图形学和计算方法的关系
  10. Echarts3柱状图切换折线图时发生位移