据说有99%的人都会做错的面试题

      这道题主要考察了面试者对浮点数存储格式的理解。另外,请不要讨论该题本身是否有意义之类的话题。本题只为了测试面试者相关的知识是否掌握,题目本身并没有实际的意义。

      下面有6个浮点类型变量,其中前三个是float类型的,后三个是double类型的。题目的代码如下:

float f_v1 = 20;
float f_v2 = 20.3;
float f_v3 = 20.5;

double d_v1 = 20;
double d_v2 = 20.3;
double d_v3 = 20.5;

cout << ((f_v1 == d_v1)?"true":"false") << endl;
cout << ((f_v2 == d_v2)?"true":"false") << endl;
cout << ((f_v3 == d_v3)?"true":"false") << endl;

问题有如下三个:

  1. 本题的运行结果是什么
  2. 请根据本题的运行结果解释其原因
  3. 如果某个cout语句的输出结果为false,在不改变变量定义语句的前提下,如何扔弃相等呢?

下面我先简要说说如何解答本题,最后再给出答案。

     首先应先了解float和double的存储方式。这里先拿float为例。float一共占4个字节,共32位。分为3部分:符号位、指数位和尾数位。分别占1位、8位和23位,存储结构如图1所示。

图1

     其中如果浮点数为正值,符号位为0,否则为1。指数位采用移位存储,也就是如果表示10^4,需要将4与127(二进制是01111111)相加存入指数位。尾数位决定了float的精度。尾数一共23位,最多可以表示8388607个值,由于没有到9999999,所以float的精度为6,如果表示的数小于8388608,那么精度可到7位。这也是为什么有的书中说float的精度是6到7位的原因。这里并不是所有的数都能精确到7位。

    另外,所谓的精度是指科学计数法E前面的数字的小数个数。例如,1.2345678E10。

这个数用float表示是可以精确到7位,因为2345678小于8388608。如果是1. 9388648E10,那么就只能精确到6位了。

如果理解了这个,还需要了解如何将十进制浮点数转换为二进制浮点数,别告诉我你不会,如果真不会的话,回大学从念吧。总之,浮点数转换是分别转换整数和小数部分。整数部分除2,小数部分乘2。例如,20.5转换为二进制是10100.1,20.3转换为二进制如下:

10100.0100110011001...1001

    其中“...”表示1001部分无限循环。也就是说20.3转换为二进制浮点数是一个而无限循环的二进制浮点数。

最后,需要知道如何用科学计数法表示二进制浮点数(长见识了吧,二进制也可以用科学计数法)。20.5的科学计数法表示是:1.01001E100

20.3的科学计数法表示是:1.0100010011001...E100

现在就可以一个萝卜一坑个了,将对应的数填入图1的三个区域吧。

 

    现在将20.5和20.3都存入double类型的变量,就可以一下看出本题的结果了。double占64位,8个字节。符号位占1位,指数位占11位,尾数位占52位。精度是15或16,原理和float一样。

 

现在公布一下答案:

true

false

true

 

如果还没理解其中的奥秘,可以看详细的视频讲解

时间: 2024-10-18 07:57:38

据说有99%的人都会做错的面试题的相关文章

大部分人都会做错的经典JS闭包面试题

由工作中演变而来的面试题 这是一个我工作当中的遇到的一个问题,似乎很有趣,就当做了一道题去面试,发现几乎没人能全部答对并说出原因,遂拿出来聊一聊吧. 先看题目代码: function fun(n,o) {   console.log(o)   return {     fun:function(m){       return fun(m,n);     }   }; }var a = fun(0);  a.fun(1);  a.fun(2);  a.fun(3);//undefined,?,?

今天很多人都会说自己在做O2O产品

今天很多人都会说自己在做O2O产品.当追问到底什么O2O,他们会回答把某个线下的东西搬到线上了去销售.再细看他们的产品,你会明白,其实就是缩小版.本地化的淘宝. 开发一个平台,然后让商户在平台发布自己的产品,提供支付功能,采取点促销措施,提高性价比,提高用户的消费欲望与增加平台流量,产生交易.O2O到底是什么? O2O其实就是一个赋予一定含义的互联网行为概念名词.它不是某种单一或是几个关联因素的组合产品或服务.既然只是个概念名词,它本身并不能该给你带来什么实际的帮助.因为这个名词的时髦,结果自己

社交应用为何最后都会做电商?

一个记者在朋友圈说"唐岩终于卖出一步了",上市之后的陌陌不只是摘掉了"约P"的帽子,还开始了大踏步的扩张步伐:同城服务.礼物商城相继上线,"卖出这一步"正是指的礼物商城.在大量社交App都做电商的大环境中,陌陌以一种跟随姿态但逻辑又大为不同的方式开始卖东西了,社交App圈人完毕后卖货已成必然.不过在笔者看来,陌陌这不是在做电商,本质还是做社交,成功不易. 社交应用为何最后都会做电商? 在陌陌推出礼物商城之前,社交App都已经"卖出一步&

关于混合云,很多人都会有这些误解

本文讲的是关于混合云,很多人都会有这些误解[IT168 编译]云计算的兴起和任何趋势化的领域一样,都会不可避免地出现相当多的炒作以及混淆视听的噪声. 混合云自然也不例外,这导致人们对云的混合方法也产生了各种各样的误解.为了消除这些误解,笔者请了几位云领域的专家,向大家分享他们对混合云的一些关键性误解的看法. 误解1:混合云意味着牺牲管治力与安全性 在企业IT中,这是一种长期存在的.有时会过度紧张的误解:云计算就意味着失去控制能力,而最终对管治.安全性和相关领域造成伤害.但对许多企业来说,这样的担

哪些人适合做产品经理

 各位啊,我想你们见过运气好的,但是就没见过像阿泡运气这样好的吧?我还没入职,就被提升走了产品部副经理,这不,我刚被别人招聘呢,现在,周扬就立刻要求我去招聘别人了. 当然,如果按照公司的招聘流程,"一面"应该是由HR来完成的,但是呢,因为我实在是不放心HR的水平(要是郭姐姐看到了,千万不要来怪我啊,我只是就事论事,绝不针对任何人),生怕漏掉了那些潜力不错的应聘者. 所以,在我一再地摆事实,讲道理的争取后,周扬总算是和HR达成一致,让我来配合他们的"一面"过程. 不过

Yahoo你没有做错什么 就是太老了!

[Yahoo估值大约30亿~40亿美元,而在2008年Yahoo曾拒绝了微软450亿美元的收购,8年过去了,Yahoo的收购估值已不到之前的十分之一.] 每隔一段时间,就有传言Yahoo即将被收购,提醒大家这家公司还活着. 今年2月份,Yahoo董事会明确表态,即将拍卖其核心资产.截至4月18日初始竞价结束,尚无官方正式决定和通告,Verizon(威瑞森,美国最大电信公司)目前在收购中处于领跑地位.Yahoo估值大约30亿~40亿美元,而在2008年Yahoo曾拒绝了微软450亿美元的收购. 8

网页制作试题 看看你都会做吗?

网页制作相关试题,看看你都会做吗? 一.单项选择题(在每小题列出的四个备选项中只有一个是符合题目要求的,请将其代码填写在题后的括号内.错选.多选或未选均无分.) 1.在CSS 中文本垂直对齐属性vertical-align 的取值top 表示( )A.写在其它元素中线的上方B.写在其它元素基线的上方C.以其它文本元素的顶线作为被定义元素的底线D.以其它普通元素的顶线作为被定义元素的底线2.一般情况下,布局属性中溢出属性的默认值为( )A.隐藏 B.滚动C.可视 D.自动3.下列选项中不属于CSS

Seo定律:99%的人都在使用过时的seo技术

对于seo工作者来说,搜索引擎既是天使,更是魔鬼,因为它养活的只是排在第一页的站长,排在后面的全是它的牺牲品.搜索引擎每一次算法更新,产生的冤魂厉鬼不计其数.可怕的是它的更新速度之快是其它行业不可比拟的,因此,seo知识也会随着搜索引擎的更新而更新.实际上很多人使用的seo知识都是过时的.因为真正掌握seo的永远只能是少数人. 为什么只有少数人能掌握真正的seo技术?这要从搜索引擎的算法更新说起. 最初的搜索引擎算法是非常单纯的,哪个网站所获得的导入链接多,或者关键词密度最大,哪个网站就能获得高

诊断 Java 代码: 提高 Java 代码的性能 尾递归转换能加快应用程序的速度,但不是所有的 JVM 都会做这种转换

简介: 很多算法用尾递归方法表示会显得格外简明.编译器会自动把这种方法转换成循环,以提高程序的性能.但在 Java 语言规范中,并没有要求一定要作这种转换,因此,并不是所有的 Java 虚拟机(JVM)都会做这种转换.这就意味着在 Java 语言中采用尾递归方法将导致巨大的内存占用,而这并不是我们期望的结果.Eric Allen 在本文中阐述了动态编译将会保持语言的语义,而静态编译则通常不会.他说明了为什么这是一个重要问题,并提供了一段代码来帮助判断您的即时(JIT)编译器是否会在保持语言语义的