bit, bytes与word
bit即比特位,是最小一级的信息单位;
byte即字节,是计算机存储容量的计量单位,1 byte=8 bits;
word指计算机字,简称字。在存储器中,通常每个单元存储一个字。因此每个字都是可以寻址的。字的长度用位数来表示,计算机的每个字所包含的位数称为字长,计算的字长是指它一次可处理的二进制数字的数目。一般地,大型计算机的字长为32-64位。
常用的字节单位:
KB(Kilobyte)
MB(Megabyte)
GB(Gigabyte)
TB(Trillionbyte)
PB(Petabyte)
EB(Exabyte)
ZB(Zettabyte)
YB(Yottabyte)
BB(Brontobyte)
float16,float32与float64
上述三者分别被称为半精度、单精度和双精度。
单精度的二进制存储结构如下:
上图第一位用来表示符号,0代表是正数,1代表是负数。
中间八位是指数部分,低位在右边,需要从右往左数;一共可以表示256个数(0-255),0到126代表-127到-1,127代表零,128-255代表1-128。
后面23位是尾数部分(决定整个值的精度),低位在左边,需要从左往右数。图中尾数部分的1在第二位,则尾数部分的值为
(
1
+
2
−
2
)
(1+2^{-2})
(1+2−2),这个1并不会存储,但它一定存在。
上图的计算结果如下:
更一般情况的计算方式如下:
ASCLL码、UTF-8和Unicode占用的字节数
[ASCII码]:一个英文字母(不分大小写)占一个字节的空间,一个中文[汉字]占两个字节的空间。一个[二进制数]字序列,在[计算机]中作为一个数字单元,一般为8位二进制数,换算为[十进制]。最小值0,最大值255。如一个ASCII码就是一个字节。
UTF-8编码:一个英文[字符]等于一个字节,一个中文(含繁体)等于三个字节。
Unicode编码:一个英文等于两个字节,一个中文(含繁体)等于两个字节。
符号:英文[标点]占一个字节,中文标点占两个字节。
单精度和双精度的选择问题
考虑下面三个方面:
1,What kind of precision does my output need?
2,Is speed not an issue at all?
3,what precision is needed in parts per million?
单、双精度的误差曲线如下图:
各种精度情况下的计算方法
Reference
https://www.jianshu.com/p/d15f17a4356e
https://stackoverflow.com/questions/43440821/the-real-difference-between-float32-and-float64
https://en.wikipedia.org/wiki/Double-precision_floating-point_format