首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何实现parseFloat

如何实现parseFloat
EN

Stack Overflow用户
提问于 2018-07-27 05:38:27
回答 1查看 761关注 0票数 0

想知道如何实现parseFloat的低级别实现,比如它如何在JavaScript中工作。

我看到的所有类型转换的例子都是在某个时候使用它的,比如。另一方面,文件相当大(来自这里)。

不知道它是一个非常复杂的函数,还是有一个简单的实现。只是想知道它是如何工作的,如果它太复杂。

也许更接近它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-27 12:50:23

parseFloat的基本数学非常简单,只需要小学算术就可以了.如果我们有十进制数字,我们可以很容易地通过以下方法将其转换为二进制:

  • 将整数部分除以二。在我们正在构建的二进制数字中,剩下的(0或1)变成了一点。商替换整数部分,我们重复,直到整数部分为零。例如,从13开始,我们得到一个商数6和剩余的1,然后我们除以6得到一个商数3和剩余的0。然后是1,1,0和1,我们就完成了。我们用相反的顺序产生的位数是1101,也就是13的二进制数。
  • 将次整数部分乘以2。整数部分成为二进制数字中的另一个位。重复对子整数部分,直到它是零,或我们有足够的比特来确定结果。例如,使用.1875,我们乘以2得到.375,它的整数部分为0。再次加倍生成.75,它的整数部分为0。接下来,我们得到1.5,它的整数部分为1。现在,当次整数部分.5翻了一倍时,我们得到1的次整数部分为0。新的位是.0011。

要确定一个浮点数,我们需要在意义中尽可能多的位(从二进制数的前导1位开始),为了舍入目的,我们需要知道下一个位以及后面的位是否是非零的。(关于额外比特的信息告诉我们,源值与符合意义的比特之间的差值是否为零,不是零,而是小于适合的最低位的1/2,准确地说是最低位的1/2,还是低于最低位的1/2。这些信息足以决定是在任何通常的舍入模式下进行整整还是向下舍入。)

上面的信息告诉您什么时候停止乘法在算法的第二部分。一旦你有了所有的意义和位,再加上一个,再加上你有一个非零位或者子整数部分是零,你就有了你所需要的所有信息,并且可以停止。

然后,根据您使用的任何舍入规则(通常是圆整到最近的关系到偶数),通过舍入位来构造浮点值,将这些位放入浮点对象的意义中,并设置指数来记录二进制数字的前导位的位置。

有一些装饰检查溢出或下溢或处理低于正常值。然而,基本的算术只是小学的算术.

出现问题是因为上面使用任意大小的数组,并且不支持使用“e”来引入十进制指数的科学表示法,如“2.79e34”中的那样。上面的算法要求我们保持所需的所有空间来乘法和除以任何长度的十进制数。通常,我们不想这样做,我们也需要更快的算法。请注意,用上述算法支持科学表示法也需要任意大小的数组。要填写“2.79e34”的小数位,我们必须用“2790000000000000000000000000000000000”填充数组。

因此,算法被开发出来,以更聪明的方式进行转换。与其做精确的计算,我们还可以做精确的计算,但仔细分析产生的误差,以确保它们太小,无法阻止我们得到正确的答案。另外,可以预先准备数据,例如包含关于10次幂的信息的表,这样我们就有了已经以二进制形式表示的十次幂的近似值,而不必每次执行转换时计算它们。

将十进制转换为二进制浮点的复杂性源于对快速使用有限资源的算法的渴望。允许一些错误导致需要数学证明以确保计算是正确的,并试图使例程快速和资源效率高,使人们想出聪明的技术来使用,这变得棘手,需要证明。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51551379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档