FE.ES-终结0.1+0.2,答到点上的那种

news/2023/12/1 11:42:25

随便逛了一下知乎和思否的博文,大都没回答到点上。

I.浮点数的二进制存储

采用 IEEE 754 规范来存储浮点数:
1位【正负符号】+11位【指数】+52位【有效数字】,如下图
clipboard.png

由于0.1.toString(2)=0.0001100110011001100110011001100110011001100110011001101
所以
0.1 = 2^-4 * [1].1001100110011001100110011001100110011001100110011010
0.2 = 2^-3 * [1].1001100110011001100110011001100110011001100110011010

II. 到底怎么相加

铁律是52位有效数字,也就是:

0.1 = 2^-3 *  0.1100110011001100110011001100110011001100110011001101(0)
0.2 = 2^-3 *  1.1001100110011001100110011001100110011001100110011010
sum = 2^-2 * 1.0011001100110011001100110011001100110011001100110011(1)

由于有效数字变成了53位,根据IEEE754 rounding mode 的 Round to Nearest,若x在a和b之间,选择最低有效位为零的值

a = 2^-2 * 1.0011001100110011001100110011001100110011001100110011
x = 2^-2 * 1.0011001100110011001100110011001100110011001100110011(1)
b = 2^-2 * 1.0011001100110011001100110011001100110011001100110100

当比较0.1+0.2 和 0.3时,实际比较的是

0.1 + 0.2 => 0:01111111101:0011001100110011001100110011001100110011001100110[100]
0.3       => 0:01111111101:0011001100110011001100110011001100110011001100110[011]

转成10进制,看上去是:

0.1 + 0.2 => 0.300000000000000044408920985006...
0.3       => 0.299999999999999988897769753748...

结果很明显啦

参考资料:
https://stackoverflow.com/que...


http://www.niftyadmin.cn/n/4634953.html

相关文章

《程序员代码面试指南》:用一个栈实现另一个栈的排序

【题目】 一个栈中元素的类型为整型,现在想将该栈从顶到底按从大到小的顺序排序,只许申请一个栈。除此之外,可以申请新的变量,但不能申请额外的数据结构。如何完成排序? 【难度】 ☆ 【解答】 将要排序的栈记为st…

SQL Server常用测试题

SQL Server常用测试题(1)题目1问题描述:为管理岗位业务培训信息,建立3个表:S (S#,SN,SD,SA) S#,SN,SD,SA 分别代表学号、学员姓名、所属单位、学员年龄C (C#,CN ) C#,CN 分别代表课程编号、课程名称SC ( S#,C#,G ) S#,C#,G 分别代表学号、所选修的课程编号、学习成绩…

1.4易学性原则

一般来说,用户应该能够通过简单的交互获取必要的信息来执行操作,而不必依赖于使用说明书或是通过多次试错来探索正确的使用方法。 一些研究结果表示,60%的新手机用户如果无法在第一次使用APP时实现目标,就会完全卸载应用程序。如…

xStream学习xml,JASON,JAVA对象转换

xStream不仅对XML的转换非常友好,而且提供annotation注解,可以在JavaBean中完成对xml节点、属性的描述。以及对JSON也支持,只需要提供相关的JSONDriver就可以完成转换。 准备工作jar文件的下载:https://nexus.codehaus.org/conten…

分表和分区详解

分区 分区就是把一个数据表的文件和索引分散存储在不同的物理文件中。 mysql支持的分区类型包括Range、List、Hash、Key,其中Range比较常用: RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区。 LIST分区&#xff…

Spark入门(二)--如何用Idea运行我们的Spark项目

用Idea搭建我们的Spark环境 用IDEA搭建我们的环境有很多好处,其中最大的好处,就是我们甚至可以在工程当中直接运行、调试我们的代码,在控制台输出我们的结果。或者可以逐行跟踪代码,了解spark运行的机制。因此我们选择了idea&…

什么是内存泄露?

简介................................................ 在计算机科学中,内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去…

struts2 constant 参数修改

<!-- 指定Web应用的默认编码集&#xff0c;相当于调用 HttpServletRequest的setCharacterEncoding方法 --> <constant name"struts.i18n.encoding" value"UTF-8" /> <!-- 该 属性指定需要Struts 2处理的请求后缀&#xff0c;该属性…

实现统计的年,月,日

时间插件用的mydate97&#xff0c;我用yii框架写的最终实现的结果为 如果选择时间间隔在 30 天之内&#xff0c;则展示这三十天中每天的数据&#xff0c;如果时间间隔 大于30天小于2年&#xff0c;则展示的是以月份为单位的数据&#xff0c;如果时间间隔大于两年&#xff0c;展…

关于java.util.LinkedHashMap cannot be cast to ......的解决办法

今天在项目中遇到一个问题&#xff0c;接口接收到list在对list进行遍历的时候报出如下错误: 断点看一下这个list感觉没有任何的问题: 那为什么会报这个错误呢 这个接口是这样的&#xff0c;在想会不会是json在转list的时候把这个list给整坏了。 于是&#xff0c;我把这个list再…

UnicodeEncodeError: 'gbk' codec can't encode character '\xbb'

【报错】 UnicodeEncodeError: gbk codec cant encode character \xbb in position 29802: illegal multibyte sequence 【解决】 出错的原因是网页及python的编码都是utf-8&#xff0c;在写入文件时Windows默认转码成gbk&#xff0c;遇到某些gbk不支持的字符就会报错。在打…

各种浏览器内核说明

[-] 1浏览器不等于IE2以IE为核心的浏览器非IE内核让我们远之却敬之的浏览器非IE内核概念常见的非IE内核浏览器 Gecko 核心&#xff1a;firefox(火狐) &#xff0c; K-Meleon &#xff0c; Netscape&#xff0c; Flock WebKit 核心&#xff1a;Chrome&#xff08;Google&…

TypeError: memoryview: a bytes-like object is required, not 'int'

【报错】 TypeError: memoryview: a bytes-like object is required, not int 【解决】 以为是编码问题&#xff0c;看报错追溯报错行&#xff0c;其实是urllib.request.urlopen()里面参数类型的问题&#xff0c;参数timout2不能只写2&#xff0c;参考书也有错误。 respons…

1.5约束原则

使用约束来帮助用户似乎是违反直觉的&#xff0c;但是施加约束意味着用户可能需要考虑更少的动作。 物理约束 利用物理结构上的约束可以将操作方法限定在一定范围内 文化约束 文化深刻影响着社会中的每个成员&#xff0c;包括人们的世界观、人生观、价值观等&#xff0c;进…

微信返回码说明

返回码说明-1系统繁忙0请求成功40001获取access_token时Secret错误&#xff0c;或者access_token无效40002不合法的凭证类型40003不合法的UserID40004不合法的媒体文件类型40005不合法的文件类型40006不合法的文件大小40007不合法的媒体文件id40008不合法的消息类型40013不合法…

两个习题

#随机两个数&#xff0c;打印最大值的数 ainput(>>>)binput(>>>)aint(a)bint(b)if a>b :print(a)else:print(b) 运用函数print.(max(a,b)) #给一个不超过五位数的数字&#xff0c;打印出数字是几位数 aint(input("nuber")) if a>100:if a>…
最新文章