当前位置: 首页 > 后端技术 > Node.js

JS-Number—理解IEEE双精度浮点数

时间:2023-04-03 15:30:11 Node.js

1.十进制转二进制回顾1)整数部分:除以2取余,倒序2)小数部分:乘以2取整,正序在线工具2.理解IEEE754双精度浮点数规范1)以二进制科学计数法存储。与十进制科学计数法类似,二进制科学技术方法的格式为1.xxx*2^N。需要注意的是,二进制科学计数法的整数部分是1,所以存储时省略了整数部分1。2)格式:符号位+指数位+尾数位符号位S:第一位为正负符号位(sign),0代表正数,1代表负数指数位E:中间11位存放指数(exponent),用于表示幂数科学计数法中的指数E可以为负数,IEEE754在表示负指数时,标准引入了偏移量1023,在存储指数转负数时加上E成正。这会产生一个11位指数,它可以表示指数范围[-1023,1024]。MantissabitM:最后52位为尾数(mantissa),超出的部分自动向上取整,未填满的部分自动补0。例如十进制数400.12用十进制科学计数法表示为:4.0012*10^2,.其中,“0012”为尾数部分。最后可以表示为(图片来源):其中S、E、M都是实际存储科学计数法的值。例如十进制4.5转二进制为://Step1转二进制100.1//Step2转二进制科学计数法1.001*2^2S=0E=2+1023=2015M=001//省略整数1检查存储情况,请参考这里3)有限集IEEE754所能表示的实数个数是有限的。假设MAX_VALUE和MIN_VALUE分别代表最大正数和最小正数,则有限集可以表示为:[-MAX_VALUE,-MIN_VALUE]U[MIN_VALUE,-MAX_VALUE]几个有趣的问题1)0.1+0.2!==0.30.1、0.2、0.3转为二进制是死循环,存储时会失精度,0.1+0.2运算时也会失精度,导致结果不等于0.3。2)加一个数最后一个非零增量也等于这个数1+Number.MIN_VALUE/2===1,如果增量小于JS能表示的最小浮点数,会被认为为0,加上这样的数等于加0。3)为什么JS中最大的整数是2^53-1而不是2^52-1?4)JS能准确表示哪些小数点?这种格式可以准确表示小数部分。1/Math.pow(2,N),其中N为区间(0,1024)内的整数。例如分数1/2、1/4、1/8。参考《抓住数据的小尾巴——JS浮点数陷阱及解决方案》可恶的IEEE-754浮点数,说“关于”和“关于”,你的底线是什么?检查你的IEEE754计算器IEEE754二进制表示以JS的名义