webgl数据的理解
# 理解二进制和十进制
二进制:只使用0和1两个数字,每个位代表2的幂次方。它是一个基数为2的数系统。
十进制:使用0到9共十个数字,每个位代表10的幂次方。它是一个基数为10的数系统。
下面将11111111、255 分别用二进制和十进制表示:
如: 11111111 -> 1 2^7 + 1 2^6 + 1 2^5 + 1 2^4 + 1 2^3 + 1 2^2 + 1 2^1 + 1 2^0= 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255
255 = 2 10^2 + 5 10^1 + 5 * 10^0
# 1字节是多少?
| 1字节(Byte)可以表示从00000000-11111111的任何一个组合。换算成十进制,为0-255的范围
# Uint8Array
int8Array是一种8位无符号整数数组,每个元素占用1字节的内存空间,可表示范围:(00000000-11111111)。这是所有类型化数组中字节数最小的。
# Uint32Array
Uint32Array是一种用于处理32位无符号整数的类型化数组 ,可表示范围:(0000000000000000000000000000000-11111111111111111111111111111111) 这个二进制数换算成十进制是0-4,294,967,295。
# Float32Array
Float32Array是WebGL为处理32位浮点数(单精度)而提供的专门数组,每个元素占用4字节的内存空间。
# Float32Array的最大值计算:
Float32Array
是一种用于存储32位浮点数的数组类型,每个元素占用4个字节(32位)。在JavaScript中,Float32Array
的元素是按照IEEE 754标准的单精度浮点数进行存储和表示的。
根据IEEE 754标准,单精度浮点数由符号位、指数部分和尾数部分组成。其中,符号位占1位,指数部分占8位,尾数部分占23位。
对于Float32Array
来说,其最大值取决于指数部分的最大值和尾数部分的最大值。指数部分的最大值是2^(8-1) - 1 = 255,而尾数部分的最大值是2^23 - 1 = 8,388,607。
因此,Float32Array
能表示的最大数可以通过以下计算得出:
最大值 = (-1)^符号位 * (1 + 尾数部分的最大值) * 2^(指数部分的最大值)
由于符号位为0,所以最大值为:
最大值 = (1 + 8,388,607) * 2^255
这个结果是一个非常大的数,具体数值可以通过计算得到。然而,由于浮点数的精度限制,实际能够精确表示的最大值要略小于这个理论最大值。
需要注意的是,当浮点数的值超过其表示范围时,会发生溢出,导致数值变为无穷大或非数字(NaN)的情况。因此,在使用Float32Array
时,需要注意避免超出其表示范围的操作。
# 为什么Float32Array也是32位 但能表示的值比 Uint32Array大很多
Float32Array虽然只有32位,但它能表示更多的值,这得益于浮点数的存储方式。下面是具体原因:
指数部分:IEEE 754标准为32位浮点数分配了8位来存储指数部分,采用偏移量形式,即实际指数值加上一个固定的偏移量(对于32位浮点数,这个偏移量是127)。这种设计允许指数部分有更大的范围,从而使得整个数值有更大的表示范围。
有效数字:标准还分配了23位来存储有效数字,这部分用于表示数值的有效部分,即尾数。通过这种方式,可以精确地表示更多的数值。
符号位:1位符号位用于表示数值的正负,这使得浮点数可以表示正数和负数。
综上所述,通过这种巧妙的设计,32位浮点数能够表示更大范围的数值,同时保持相对较高的精度。这使得Float32Array在科学计算、图形处理等领域非常有用。