关于计算机的信息表示&对于数字的一些思考
Posted 请填写此字段
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于计算机的信息表示&对于数字的一些思考相关的知识,希望对你有一定的参考价值。
对计算机而言,没有数字,只有数值类型。
在计算机眼中一切都是离散的,因为物理上它只拥有有限的位数:比如说有32个开关,计算机只知道其中哪些是打开的、哪些是关闭的,并不知道背后的含义。
是人类给这32个开关的开闭状态赋予含义。将这$2^{32}$种开闭情况映射成$2^{32}$个整数,就得到32位整型类型;将映射成$2^{32}$个实数,就得到32位浮点类型。
所以给定32个位,不管是映射成无符号整型、补码整型还是浮点数,最多能表达的数字个数是相同的。那么不同的映射方式得到的range,也就是数字的范围,就取决于这种映射的“密度”了。
以整数为例,一般情况下希望整数是连贯的,因此假设这$2^{32}$个整数的最小的数是$a$,那么最大的数就应该是$a+2^{32}-1$. 但如果你非得要创造一个新的数值类型,比如说叫“稀整型”,代表差为2的等差数列,那么最大的数则为$a+2*(2^{32}-1)$.
所以“稀整型”和整型表达的数字个数是一样的,但前者表达的范围大多了——代价是精度变低。比如说令$a=1$,那么“稀整型”不包含2,当然也不包含4/6/8...,所以一个只支持“稀整型”的计算机系统,在计算$1+1$时是无法得到$2$这个“正确答案”的,只能选择将“2”这个不存在的数投影到“稀整型”集合上,也就是说在“稀整型”集合上找一个和2尽可能接近的数字。正常情况下应该是1或3,但也不排除这个系统被设计成认为1023和2最接近,因此告诉你$1+1=1023$.
这上面提到的思想,包括特定数值类型代表的集合、集合元素的间距、集合元素的范围、不在该集合的数值如何投影到这个集合上,事实上都体现在浮点数的设计上。
在说浮点数的设计之前不妨先提一下二进制小数。
人类是通过“切分”认识到小数的:将1切成10份,一份是0.1,3份是0.3;将1切成2份,一份是0.5。这就是十进制小数和二进制小数。切2份得到0.5,切4份得到0.25,切8份得到0.125,诸如此类。比如说可以将1切成$2^{32}$份,每份的大小是$2^{-32}$,这样$2^{32}$个元素可以映射到这样一个等差数列上:$0,2^{-32},2^{-31},2^{-31}+2^{-32},...,1-2^{-31}$. 或者可以将这$2^{32}$个数的一半挪到负数上。这就是二进制小数的基本思想。
可以看出二进制小数和整型一样,是等距的。等距的问题就在于不太贴合现实应用场景,比如说在科学计算时一般希望数字的绝对值较小时有较高的精度,绝对值较大时则需要的精度可以降低——这就不是等距的。
浮点数通过“指数函数”的性质解决了等距的问题。不妨只考虑正数的情况,负数是对称的。
还记得上面提到从“开闭状态”到“数字”的映射是人定义的,这种映射可以看作是一个函数,x轴为不同开闭状态的ID编号,y轴为某个数字.
以上是关于关于计算机的信息表示&对于数字的一些思考的主要内容,如果未能解决你的问题,请参考以下文章