Skip to content
On this page

标题图

精彩看点

  • 二进制表示浮点数
  • 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 的任意精度运算,可以看看源码

参考:JavaScript 中精度问题以及解决方案

聊聊 Web3.0 是什么,为什么元宇宙这么火?

内容

web3 是一种思想上的创新。web1 是被动消费,一些公司宣传吸引眼球的内容,消费者来观看,如 UC 浏览器,web2 是主动参与贡献,但由平台中心管控,平台可以控制你的内容是否能被其他人观看,如抖音、YouTube,web3 是完全由用户掌控,去中心化,它可以是一个不区分地域和疆界,而是以兴趣、语言、职业、主题进行聚集和管理的王国。要实现 web3 可分为以下三点:

  1. 引入去中心化机制
  2. 凸显劳动价值,你的动作能给你带来报酬
  3. 虚拟资产的认可

元宇宙:建立在 web3 的基础上,模拟仿真世界,可以赚取现实收益

为什么要搞元宇宙?传统互联网增长乏力,人口增长速度有限,要建造出更多新颖的东西吸引用户

思考

我认为去中心化,完全不受管控,也并不绝对是好事

最开始,还以为 web3 是技术上的创新,没想到实际是更注重思想上的创新

可以多了解一下新技术,如 NFT

NFT 百度视频解释:全称为 Non-Fungible Token,指非同质化代币,是用于表示数字资产(视频、音频、摄影)的唯一加密货币令牌,可以买卖。优势:可溯源、永续收益、可互动(基于原作二次创新)

最近大火的 NFT 数字藏品是什么?

内容

什么是元宇宙?元宇宙的英文名称叫 Metaverse,区别于当前真实的宇宙 Universe,Universe 是由原子组成的物理宇宙,Metaverse 是比特组成的数字宇宙,当前我们在物理宇宙中从事生活、生产,这里有我们的资产、人际关系等等。未来在元宇宙中也会如此,我们会在这一数字宇宙中从事生产、创作、教育等等,拥有我们全新的人际关系,和千变万化的数字资产。

元宇宙应该是数字世界的现实化,而不是现实世界的数字化

区块链一定是数字世界现实化的核心支撑:

  • 区块链通过技术实现数字资产的私有制,这一点将极大的激励用户从事价值创造

  • 区块链可以实现价值(资产)流转趋向于零边际成本,推动元宇宙资产自由流动

    • 信息互联网最伟大的价值在于通过 TCP/IP 协议实现了信息流转趋向零边际成本,如此才有了我们当前繁荣信息互联网的生态。

      区块链将作为一种新的协议,一种面向资产的协议,将实现价值(资产)流转趋向于零边际成本

非同质化通证技术最大的特点是高效低成本。说到低成本,大家可能会有一个认知,那就是区块链因其冗余存储和多方共识,其实是一个成本并不低的交易系统,其实,大家看到的只是一个非常简单的技术成本,区块链的技术成本相比我们现在社会的交易成本是小巫见大巫的。

就像在信息互联网诞生之前,我们的通信成本是很高的,每分钟电话费都是很昂贵的,但到了信息互联网下,我们的信息交流成本无限趋近于零,基于区块链的价值互联网也是如此,我们会把资产的交易成本优化到一个非常非常低的水平。

思考

了解元宇宙、区块链的好文

TCP/IP 协议实现信息流转零成本,区块链实现价值(资产)流转零成本

「现在找到了合规的资产,我们终于找对了,开始在合规的方向下探索中国特色的价值互联网」满满的求生欲 😂

2021-12-31 ~ 2022-01-06(第 4 期)