发布于 2018-07-27 12:50:23
parseFloat的基本数学非常简单,只需要小学算术就可以了.如果我们有十进制数字,我们可以很容易地通过以下方法将其转换为二进制:
要确定一个浮点数,我们需要在意义中尽可能多的位(从二进制数的前导1位开始),为了舍入目的,我们需要知道下一个位以及后面的位是否是非零的。(关于额外比特的信息告诉我们,源值与符合意义的比特之间的差值是否为零,不是零,而是小于适合的最低位的1/2,准确地说是最低位的1/2,还是低于最低位的1/2。这些信息足以决定是在任何通常的舍入模式下进行整整还是向下舍入。)
上面的信息告诉您什么时候停止乘法在算法的第二部分。一旦你有了所有的意义和位,再加上一个,再加上你有一个非零位或者子整数部分是零,你就有了你所需要的所有信息,并且可以停止。
然后,根据您使用的任何舍入规则(通常是圆整到最近的关系到偶数),通过舍入位来构造浮点值,将这些位放入浮点对象的意义中,并设置指数来记录二进制数字的前导位的位置。
有一些装饰检查溢出或下溢或处理低于正常值。然而,基本的算术只是小学的算术.
出现问题是因为上面使用任意大小的数组,并且不支持使用“e”来引入十进制指数的科学表示法,如“2.79e34”中的那样。上面的算法要求我们保持所需的所有空间来乘法和除以任何长度的十进制数。通常,我们不想这样做,我们也需要更快的算法。请注意,用上述算法支持科学表示法也需要任意大小的数组。要填写“2.79e34”的小数位,我们必须用“2790000000000000000000000000000000000”填充数组。
因此,算法被开发出来,以更聪明的方式进行转换。与其做精确的计算,我们还可以做精确的计算,但仔细分析产生的误差,以确保它们太小,无法阻止我们得到正确的答案。另外,可以预先准备数据,例如包含关于10次幂的信息的表,这样我们就有了已经以二进制形式表示的十次幂的近似值,而不必每次执行转换时计算它们。
将十进制转换为二进制浮点的复杂性源于对快速使用有限资源的算法的渴望。允许一些错误导致需要数学证明以确保计算是正确的,并试图使例程快速和资源效率高,使人们想出聪明的技术来使用,这变得棘手,需要证明。
https://stackoverflow.com/questions/51551379
复制相似问题