预测以下C程序的输出:

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

    上面程序的输出是“ ELSE IF”,这意味着表达式“ 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;
}
在C编译器上,上述程序的输出为“ 4 8 4”。
它实际打印出float的大小,double的大小和float的大小。

    表达式中使用的值被视为double(双精度浮点格式),除非在末尾指定了“f”。所以表达式“x==0.1”的右边有一个double,左边是以单精度浮点格式存储的float。在这种情况下,float被提升为double。双精度格式比单精度格式使用更多的精度位。
    0.110_{10}10​(十进制的数0.1)的二进制等价数可以写成(0.0001100110011…)2_22​,它可以无限大(有关转换的更多信息,请参阅本文)。由于float的精度小于double,因此在某个点(float中为23,double中为52)之后,它将截断结果。因此,在将float提升为double(在比较时)之后,编译器将用零填充剩余的位。因此,我们得到的结果不同,两者的十进制当量也不同。

float值为
=> (0.1) (十进制)= (0.00011001100110011001100)(二进制)
float提升为double后,double值为:
=> (0.1)(十进制) = (0.00011001100110011001100000000000000000...)(二进制)^ padding zeroes here
未提升的原始double值为:
=> (0.1)(十进制) = (0.0001100110011001100110011001100110011001100110011001)(二进制)因此,我们可以看到两个方程的结果是不同的。
因此,“if”语句永远不能执行。

    请注意,当值(如0.1)使用的精度位多于单精度位时,将float提升为double只会导致不匹配。
    示例,下面的C程序打印“IF”。

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

    输出:

IF

    这里0.510_{10}10​的二进制等价物是(0.100000…)2_22​(浮点型和双精度型都不会丢失精度)。因此,如果编译器在升级时填充额外的零,那么我们将得到相同的结果,在比较中,左右两侧的十进制等价值(x==0.5)。

参考文档

[1]Abhay Rathi.Comparison of a float with a value in C[EB/OL].https://www.geeksforgeeks.org/comparison-float-value-c/,2020-11-17.

C语言中float值的比较相关推荐

  1. 转载——C语言中float,double类型,在内存中的结构(存储方式)

    最近在做一个数据格式分析和转换的项目,第一次接触底层的二进制代码存储,看的一头雾水,看到这个帖子后对于在Windows系统下数据的存储方式有了更多的了解,将原文分享一下: 原文地址为http://ww ...

  2. c语言中不正确的浮点型常量,c语言中float a=1;对吗?,c语言的问题。float a=1,*b=a,*c=...

    导航:网站首页 > c语言中float a=1:对吗?,c语言的问题.float a=1,*b=&a,*c= c语言中float a=1:对吗?-,c语言的问题.float a=1,*b ...

  3. c语言 float 取反,c语言中FLOAT是如何表示.doc

    c语言中FLOAT 是如何表示的 HYPERLINK "/blog/static/1264962942009933219393/" 默认分类 ??2009-10-03 15:21 ...

  4. c语言float怎么表示,c语言中float是如何表示的

    <c语言中float是如何表示的>由会员分享,可在线阅读,更多相关<c语言中float是如何表示的(6页珍藏版)>请在技术文库上搜索. 1.c语言中 FLOAT 是如何表示的 ...

  5. c语言用int取整取了小数_[c语言取整算法]C语言中float型数据怎么取整数部分算法或取小数部分...

    C语言中float型数据怎么 取整数部分算法 或取小数部分 float福n=12.223; int x=(int)n; float y=n-(float)x; C语言有哪些取整函数? C语言有以下几种 ...

  6. c语言指数部分尾数部分,C语言中 float double在内存中的存储

    C语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit, double数据占用 64bit,我们在声明一个变量float f= 2.2 ...

  7. C语言中float精度问题探究

    对于精度要求较高的开发场景,C中的浮点数精度问题需要特别注意.对于有很多经验的开发者而言,可能只知道C语言的float精度在6-7位之间,为什么是7?为什么又是6-7?网上的文章大部分一大抄,而且很多 ...

  8. c语言中 float delta,比较float和double值与delta吗?

    据我所知,浮点类型的值必须仔细比较以避免固有浮点错误的问题.通过比较值和错误阈值可以改善这一点.比较float和double值与delta吗? 例如,下面的解决方案比一个简单的测试x == y更多的可 ...

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

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

最新文章

  1. 喜欢的Groove Coverage She
  2. 玩家在RTX 3090显卡中发现了指套
  3. 收藏 | 那些机器学习必备知识
  4. 国外优秀技术网站推荐
  5. 判断一个变量是否在一个数组里
  6. ISO20000/ISO27001认证区别和证书展示
  7. SQL Server不允许保存更改的解决方法
  8. STM32F103使用硬件i2c作为从机模式
  9. 前后端数据交互(八)——请求方法 GET 和 POST 区别
  10. HTML5+CSS大作业——学生个人博客(5页) 大学生个人博客网页作品 网页设计作业模板 学生网页制作源代码下载
  11. android基础的博客,【复习】Android基础
  12. 7-7 阿泽的交友标准 (10 分)
  13. 纺织企业举步维艰,小微纺织企业该如何做?
  14. 秒杀Excel的动态可视化报表,不用学python,用它仅需10分钟
  15. 岁月温柔-21 妈妈转到省医院第2天
  16. handle与handler的区别
  17. Marlon's String zoj3587
  18. pc android ios 学英语,全面升级更新.免费 小学英语人教版.三起[Android.iOS]
  19. JSON实例类 key可带中文
  20. 基于5G技术的智能导航机器人及AR巡逻应用开发项目实施方案(上)

热门文章

  1. 输出100以内的质数 java
  2. Linux外网远程登录访问内网主机
  3. 一家游戏公司PHP面试题-笔试题(PHP)
  4. Intel System Flags and Fields in the EFLAGS Register
  5. JS-7种IIFE写法
  6. 建筑基础资料员学习工作文档
  7. 营收增长乏力亏损连连 人造肉第一股Beyond Meat何时出坑?
  8. 白头发越来越多怎么办?30多岁白头发越来越多怎么办?
  9. 应用ODBC API建立应用程序
  10. 关于浅拷贝深拷贝那些事儿