精彩看点
- 二进制表示浮点数
- web3(元宇宙、NFT)概念介绍
文章
为什么 0.1 + 0.2 不等于 0.3 ?
来自:图解系统-小林 coding-v1.0 pdf
内容
为什么负数要用补码表示?
整数类型在计算机中的存储:以 int 举例,4 个字节(32 位),最高位(1 位)0 代表正数,1 代表负数
补码:把正数的⼆进制全部取反再加 1,⽐如 -1 的⼆进制是把数字 1 的⼆进制取反后再加 1
为什么要引入补码这么麻烦的东西?
如果不用,只是改变符号位,那么我们计算下 -2+1
这个过程
-2
10000000000000000000000000000010
1
00000000000000000000000000000001
-2 + 1 (答案变成了-3)
10000000000000000000000000000011
直接相加这明显答案是不对的,必须要增加额外操作才能使结果正确,而在计算机中,加减法操作是很常用的,为了性能考虑,所以使用了补码,补码直接相加,结果是正确的
-2(补码)
11111111111111111111111111111110
1
00000000000000000000000000000001
-1(补码)
11111111111111111111111111111111
并且-1 + -2
也是成立的
-1
11111111111111111111111111111111
-2
11111111111111111111111111111110
-3
11111111111111111111111111111101
所以这就是使用补码的原因
十进制小数与二进制的转换
如 8.625
怎么转换成二进制?
首先 8 就正常转换 1000
,接着,小数是这样处理的
0.625 x 2 === 1.25 记1
0.25 x 2 === 0.5 记0
0.5 x 2 === 1 记1
0 循环终止
所以结果为1000.101
但并不是所有小数都可以表示的,比如0.1
0.1 x 2 === 0.2 记0
0.2 x 2 === 0.4 记0
0.4 x 2 === 0.8 记0
0.8 x 2 === 1.6 记1
0.6 x 2 === 1.2 记1
0.2 x 2 === 0.4 记0 这里开始无限循环了
0.4 x 2 === 0.8 记0
0.8 x 2 === 1.6 记1
0.6 x 2 === 1.2 记1
0.2 x 2 === 0.4 记0 这里开始无限循环了
...
你可以发现 0.2 x 2 === 0.4
出现了 3 次,即从这里开始了无限循环,由于计算机的资源是有限的,所以无法用二进制精确表示 0.1,只能用近似值来表示,就是在有限的精度情况下,最大化接近 0.1 的二进制数,于是便造成了精度缺失的情况(这种情况其实对于我们并不陌生,二进制无法精确表示0.1
就像十进制无法精确表示1/3
一样)
那二进制如何转十进制小数呢,以 10.625 为例,如图:
计算机是怎么存小数的?
8.625
对应 1000.101
是定点数,代表小数点是死的,不能移动,如果你移动了小数点的位置,那么他的值就变了,然而在计算机中是采用浮点数存储的,代表小数点是可以浮动变化位置的,例如1000.101
可表示为1.000101 x 2^3
,因为把小数点向左移了 3 位,而且这是二进制,所以只要乘上 2 的 3 次方即可回到原始值,类似科学计数法
科学计数法:
⽐如有个很⼤的⼗进制数 1230000
,我们可以也可以表示成 1.23 x 10^6
,这种⽅式就称为科学记数法。
该⽅法在⼩数点左边只有⼀个数字,⽽且把这种整数部分没有前导 0 的数字称为规格化,⽐如 1.0 x 10^(-9)
是规格化的科学记数法,⽽ 0.1 x 10^(-9)
和 10.0 x 10^(-9)
就不是了。
那这里要把二进制都存成规格化的科学计数法,也就是1.000101 x 2^3
,这时可以发现1.000101
中的第一个 1 总是不变的,因为不可能以 0 开头,以 0 开头就不是规格化的了,2^3
中的 2 也总是不变的,因为总是二进制,所以这两个值可以不用存储,重要的是如下的数据:
- 尾数 也就是
1.000101 x 2^3
中的000101
- 指数 也就是
1.000101 x 2^3
中的3
现在绝⼤多数计算机使⽤的浮点数,是采用 IEEE 754 制定的国际标准:
符号位 + 指数位 + 尾数
指数位的⻓度越⻓,数值就越⼤
尾数位的⻓度越⻓,数值就越精度
单精度浮点数 float 32位
符号位(1) + 指数位(8) + 尾数(23)
双精度浮点数 double 64位
符号位(1) + 指数位(11) + 尾数(52)
因为指数位没有符合位,那么又需要表示负数,所以引入的偏移量,float
的偏移量是 127,那么如下即可表示 8.26
1000.101 转为浮点
1.000101 x 2^3
存到 float 中,二进制为:
0(符号位) + 10000010(指数:127+3 也就是130的二进制) + 00010100000000000000000(尾数:直接把尾数写到这里,共23位)
可使用binaryconvert验证一下,是一致的

MAX_VALUE 的计算也和这里有关:
// 能精确表示的整数范围上限,S为1个0,E为11个0,S为52个1
Math.pow(2, 53) - 1 === Number.MAX_SAFE_INTEGER // true
// 能精确表示的整数范围下限,S为1个1,E为11个0,S为52个1
-(Math.pow(2, 53) - 1) === Number.MIN_SAFE_INTEGER // true
// 能表示的最大数字,S为1个0,E为971,S为52个1
(Math.pow(2, 53) - 1) * Math.pow(2, 971) === Number.MAX_VALUE // true
// 能表示的最接近于0的正数,S为1个0,E为-1074,S为0
Math.pow(2, -1074) === Number.MIN_VALUE // true
思考
如何进制转换?七进制转换
为什么需要数据类型?因为要在内存中存数据,你是什么样的类型,决定了你要开辟多少内存空间
自己可以写个国内版的 binaryconvert,这是另一个选择:更方便操作,打钩即可改变二进制的值
parseInt 是否会受限于数字溢出?是的,太大就变成 Infinity 了
float 指数范围是 -126 ~ +127
为什么只有 254 个,2^8 不是 256 吗?少的数哪里去了(存了 NaN 和 Infinity?)
cpu 如何使用二进制进行加减乘除法的?
为什么我把 a 赋值了 0.3,JS 能正确的存 0.3 呢?
Number.MAX_VALUE
1.7976931348623157e+308
Number.MIN_VALUE
5e-324
Number.EPSILON
2.220446049250313e-16
这些是如何计算的?
可深入了解:每个计算机科学家都应该了解的关于浮点运算的知识、decimal.js JS 的任意精度运算,可以看看源码
聊聊 Web3.0 是什么,为什么元宇宙这么火?
内容
web3 是一种思想上的创新。web1 是被动消费,一些公司宣传吸引眼球的内容,消费者来观看,如 UC 浏览器,web2 是主动参与贡献,但由平台中心管控,平台可以控制你的内容是否能被其他人观看,如抖音、YouTube,web3 是完全由用户掌控,去中心化,它可以是一个不区分地域和疆界,而是以兴趣、语言、职业、主题进行聚集和管理的王国。要实现 web3 可分为以下三点:
- 引入去中心化机制
- 凸显劳动价值,你的动作能给你带来报酬
- 虚拟资产的认可
元宇宙:建立在 web3 的基础上,模拟仿真世界,可以赚取现实收益
为什么要搞元宇宙?传统互联网增长乏力,人口增长速度有限,要建造出更多新颖的东西吸引用户
思考
我认为去中心化,完全不受管控,也并不绝对是好事
最开始,还以为 web3 是技术上的创新,没想到实际是更注重思想上的创新
可以多了解一下新技术,如 NFT
NFT 百度视频解释:全称为 Non-Fungible Token,指非同质化代币,是用于表示数字资产(视频、音频、摄影)的唯一加密货币令牌,可以买卖。优势:可溯源、永续收益、可互动(基于原作二次创新)
最近大火的 NFT 数字藏品是什么?
内容
什么是元宇宙?元宇宙的英文名称叫 Metaverse,区别于当前真实的宇宙 Universe,Universe 是由原子组成的物理宇宙,Metaverse 是比特组成的数字宇宙,当前我们在物理宇宙中从事生活、生产,这里有我们的资产、人际关系等等。未来在元宇宙中也会如此,我们会在这一数字宇宙中从事生产、创作、教育等等,拥有我们全新的人际关系,和千变万化的数字资产。
元宇宙应该是数字世界的现实化,而不是现实世界的数字化
区块链一定是数字世界现实化的核心支撑:
区块链通过技术实现数字资产的私有制,这一点将极大的激励用户从事价值创造
区块链可以实现价值(资产)流转趋向于零边际成本,推动元宇宙资产自由流动
信息互联网最伟大的价值在于通过 TCP/IP 协议实现了信息流转趋向零边际成本,如此才有了我们当前繁荣信息互联网的生态。
区块链将作为一种新的协议,一种面向资产的协议,将实现价值(资产)流转趋向于零边际成本
非同质化通证技术最大的特点是高效低成本。说到低成本,大家可能会有一个认知,那就是区块链因其冗余存储和多方共识,其实是一个成本并不低的交易系统,其实,大家看到的只是一个非常简单的技术成本,区块链的技术成本相比我们现在社会的交易成本是小巫见大巫的。
就像在信息互联网诞生之前,我们的通信成本是很高的,每分钟电话费都是很昂贵的,但到了信息互联网下,我们的信息交流成本无限趋近于零,基于区块链的价值互联网也是如此,我们会把资产的交易成本优化到一个非常非常低的水平。
思考
了解元宇宙、区块链的好文
TCP/IP 协议实现信息流转零成本,区块链实现价值(资产)流转零成本
「现在找到了合规的资产,我们终于找对了,开始在合规的方向下探索中国特色的价值互联网」满满的求生欲 😂
2021-12-31 ~ 2022-01-06(第 4 期)