想知道如何实现parseFloat
的底层实现,例如它在JavaScript中的工作方式。
我见过的所有有关类型转换的示例都在某个时候使用它,例如this,this或this。另一方面,this文件很大(来自here)。
想知道它只是一个非常复杂的功能还是一个简单的实现。总体上想知道它是否过于复杂。
也许this离它更近。
答案 0 :(得分:1)
parseFloat
的基本数学非常简单,只需要小学数学即可。如果我们有一个十进制数字,可以通过以下方式轻松地将其转换为二进制:
要确定浮点数,我们需要与有效位数相符的位数(从二进制数开头的1位开始),并且为了取整,我们需要知道下一位以及是否有位之后的位不为零。 (有关额外位的信息告诉我们,源值和适合有效位数的位之间的差是否为零,不是零,但小于适合的最低位的1/2,恰好是最低位的1/2 ,或大于最低位的1/2。此信息足以决定在任何常规舍入模式下是向上舍入还是向下舍入。)
以上信息在算法的第二部分告诉您何时停止乘法。一旦有了所有的有效位,再加上一个,再加上一个非零位或子整数部分为零,您便拥有了所需的所有信息,并且可以停止。
然后,通过根据所使用的舍入规则对位进行四舍五入来构建浮点值(通常是四舍五入关系到偶数),将这些位放入浮点对象的有效位中,并设置指数以记录二进制数字的前导位的位置。
有些装饰可以检查上溢或下溢或处理不正常的值。但是,基本算术只是小学算术。
出现问题是因为上面的代码使用了任意大小的数组,并且因为它不支持像“ 2.79e34”那样使用“ e”表示十进制指数的科学计数法。上面的算法要求我们保持给定给定长度的十进制数字乘以和除的所有空间。通常,我们不想这样做,我们也想要更快的算法。请注意,使用上述算法支持科学计数法也将需要任意大小的数组。要填充“ 2.79e34”的十进制数字,我们必须用“ 27900000000000000000000000000000000000000”填充一个数组。
因此,开发了算法以更智能的方式进行转换。除了进行精确的计算之外,我们可以进行精确的计算,但是要仔细分析所产生的错误,以确保这些错误太小而无法阻止我们获得正确的答案。另外,可以预先准备数据,例如具有10的幂信息的表,这样我们就已经具有二进制的10的幂的近似值,而不必在每次转换时都进行计算。
将十进制转换为二进制浮点的复杂性源于对快速且使用有限资源的算法的需求。允许一些错误会导致需要数学证明以确保计算正确,并试图使例程快速且资源高效地使用,导致人们想到了要使用的聪明技术,这变得棘手且需要证明。