据说有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

 

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

本文转自银河使者博客园博客,原文链接http://www.cnblogs.com/nokiaguy/p/3929587.html如需转载请自行联系原作者


银河使者

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

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

相关文章

php使用mysql5和8的区别_mysql8.0和mysql5.7的区别是什么?

区别&#xff1a;mysql8.0的索引可以被隐藏和显示&#xff0c;当一个索引隐藏时&#xff0c;他不会被查询优化器所使用&#xff1b;2、mysql8.0新增了“SET PERSIST”命令&#xff1b;3、从mysql8.0开始&#xff0c;数据库的缺省编码将改为utf8mb4&#xff0c;包含了所有emoji字…

mysql pt check sum_percona工具pt-table-checksum

利用pt-table-checksum进行数据库同步检查rpm方式#wget percona.com/get/percona-toolkit.rpm源码方式#wget http://www.percona.com/downloads/percona-toolkit/2.2.1/percona-toolkit-2.2.8.tar.gz#yum install perl perl-CPAN perl-DBD-MySQL perl-Time-HiRes解压&#xff0…

如何通过BBED找回删除数据

项目案例&#xff1a;客户删除delete了重要数据&#xff0c;无备份&#xff0c;客户联系我&#xff0c;要求恢复相应数据。本次通过实验方式重现客户现场。备份高于一切&#xff0c;首先备份&#xff0c;再操作 创建表格&#xff1a; create table king(age number,name varcha…

mysql 重置密码语音_数字语音信号处理学习笔记语音信号的同态处理(2)

5.4 复倒谱和倒谱 定义 设信号x(n)的z变换为X(z) z[x(n)]&#xff0c;其对数为&#xff1a; (1) 那么 的逆z变换可写成&#xff1a; (2) 取 (1)式则有 (3) 于是式子(2)则可以写成 (4) 则式子(4)即为信号x(n)的复倒谱 的定义。因为 一般为复数&#xff0c;故称 为复倒谱。如果对…

NFS 八步神曲

Server:第一步yum install - y nfs*第二步vi /etc/exports第三步/var/testdirs *(rw,all_squash,anonuid99,anongid99,sync)第四步service nfs start第五步chkconfig --level 35 nfs on Client第一步mount 192.168.1.X:/var/www/testdirs /var/www/testdirs第二步vi /et…

mysql权限日志_mysql权限管理、日志管理及常用工具

mysqlbinlog用法如下&#xff1a;mysqbinlog mysql.err 查询错误日志当然可以通过添加参数来查看指定内容,如&#xff1a;mysqlbinlog mysql-bin.000001 -d test 只显示对test数据库的二进制日志mysqlbinlog mysql-bin.000001 -o 3 -r result-file 首先忽略前三个操作&…

Juicer.js模板引擎问题

由于jsp中的EL表达式语法和jquery.tmpl十分类似&#xff0c;&#xff0c;所以单纯的使用${name}&#xff0c;数据是渲染不上tmpl的. SO.. 要加上转义: ${${}amount} 或者 \${amount} 转载于:https://www.cnblogs.com/fighxp/p/7890288.html

python把回车作为输入_python将回车作为输入内容的实例

当input输入内容的时候,许多情况下输入回车键另起一行输入,但是这时候Pycharm就执行程序,然后结束,导致无法继续输入内容。 原因:Python默认遇到回车的时候,输入结束。所以我们需要更改这个提示符,在遇到其他字符的时候,输入才结束。 比如有一个任务: 请输入文件名:悯…

ubuntu下修改时区和时间

applications-Accessories-Time & Date-点下锁-输入密码-把时区改成上海&#xff08;这个要点图中国与朝鲜之间的弯处才行&#xff0c;写不生效&#xff09;-Set the time 选Manually-改下时间、日期-直接关闭即可(重启后依然生效) 注&#xff1a;从电脑上边的时间处-Time …

python提供了9个基本的数值运算操作符_Python学习笔记(三)Python基本数字类型及其简单操作(1)...

一、数字类型表示数字或数值的数据类型称为数字类型,Python语言提供3种数字类型&#xff1a;整数、浮点数和复数&#xff0c;分别对应数学中的整数、实数和复数&#xff0c;下面就一起来了解一下他们吧&#xff01;1.整数类型整数类型与数学中整数的概念一致&#xff0c;整数类…

hdu 5139 数据的离线处理

所谓的数据离线处理&#xff0c;就是将所有的输入数据全部读入后&#xff0c;在进行统一的操作&#xff0c;这样当然有好处&#xff0c;比如让你算好多数的阶层&#xff0c;但是输入的每个数是没有顺序的&#xff0c;其实跟可以线性的解决&#xff0c;但是由于没有顺序的输入&a…

vue 后台返回的文件流进行预览_vue实现下载文件流完整前后端代码

这篇文章主要为大家详细介绍了vue实现下载文件流完整前后端代码&#xff0c;文中示例代码介绍的非常详细&#xff0c;具有一定的参考价值&#xff0c;感兴趣的小伙伴们可以参考一下使用Vue时&#xff0c;我们前端如何处理后端返回的文件流首先后端返回流&#xff0c;这里我把流…

OSPF-5类LSA和4类LSA

# 5类LSA &#xff1a;外部路由前缀 ASBR的router_id IOU5#sh ip ospf data extOSPF Router with ID (5.5.5.5) (Process ID 1)Type-5 AS External Link StatesLS age: 71Options: (No TOS-capability, DC, Upward)LS Type: AS External LinkLink State ID: 10.1.55.0 (Extern…

2014年9月计算机二级mysql真题_2017年9月全国计算机二级MySQL考试章节练习题

2017年9月全国计算机二级MySQL考试章节练习题计算机二级考试成绩在“及格”&#xff0c;即60~89分者&#xff0c;由教育部考试中心发合格证书&#xff0c;考试成绩在“优秀”&#xff0c;即90~100分者&#xff0c;由教育部考试中心发优秀证书。这是小编给大家提供的2017年9月全…

macOS 10.11.* 安装scrapy

1.安装brew&#xff0c;然后修改brew源为某高校 2.更新python brew install python 3.安装pip 4.安装scrapy&#xff0c;这里肯定会有一个坑&#xff0c;之前在网上看到10.11开启了什么rootless的东西&#xff0c; 会遇到安装six失败&#xff0c;原因是由于系统安装了six&#…

eclipse使用小技巧

1. eclipse自带内存监视及回收插件 菜单 Window > Preferences > General > 右边&#xff0c;把 Show Heap Status 打上勾就会在右下角任务栏显示内存监视器,并且可以点击内存回收。 2. http://www.eclipse.org/downloads/3. 摘录热键篇&#xff1a;Template&#xff…

mysql @ $_mysql常见笔试题

一、Mysql常见笔试题1、Mysql 中有哪几种锁&#xff1f;(1)表级锁&#xff1a;开销小&#xff0c;加锁快。不会出现死锁&#xff0c;锁定粒度大&#xff0c;发生锁冲突的概率高&#xff0c;并发度低。(2)行级锁&#xff1a;开销大&#xff0c;加锁慢。会出现死锁&#xff0c;锁…

mysql无法与外部健形成约束_MySQL Rails:错误:150“外键约束不正确”

我试图迁移我的Rails MySQL数据库&#xff0c;我收到以下错误&#xff1a;ActiveRecord :: StatementInvalid&#xff1a;Mysql2 :: Error&#xff1a;无法创建表development.comments(错误&#xff1a;150“外键约束形成错误”)&#xff1a;CREATE TABLE注释(id int AUTO_INCR…

按角度构建切变矩阵

切变是坐标系的变换&#xff0c;非均匀的拉伸。切变时候&#xff0c;角度变化&#xff0c;但是面积或体积不变。也可以理解为坐标轴间的角度变化&#xff0c;造成的扭曲。 如下图&#xff0c;这是x坐标根据y坐标的切变&#xff0c;机器人的y坐标没有变化&#xff0c;只有x坐标变…

java 语法_Java基础语法

标识符定义给包,类,方法,变量起名字的符号。组成规则标识符由字母、数字、下划线、美元符号组成。命名原则:见名知意包名&#xff1a;全部小写,多级包用.隔开。举例&#xff1a;com.jourwon类、接口&#xff1a;一个单词首字母大写&#xff0c;多个单词每个单词的首字母大写。举…