【发布时间】:2012-03-12 02:52:12
【问题描述】:
有没有一种相当快速的方法可以从 Javascript 中的数字中提取指数和尾数?
AFAIK 无法获取 Javascript 中数字后面的位,这让我觉得我正在研究一个因式分解问题:找到 m 和 n 使得 2^n * m = k 对于给定k。由于整数分解在 NP 中,我只能假设这将是一个相当困难的问题。
我正在实现一个用于生成 Javascript 的 GHC 插件,需要实现 decodeFloat_Int# 和 decodeDouble_2Int# primitive operations;我想我可以重写基础库的部分,使用该操作来做他们以其他方式做的事情(这不应该太难,因为所有数字类型都以数字作为它们的表示,)但是它'如果我不必这样做,那就太好了。
有没有什么方法可以通过一些黑暗的 Javascript 巫术、聪明的数学或其他方式以一种甚至远程执行的方式来做到这一点,或者我应该只是系好安全带并在基础库中使用?
编辑 基于 ruakh 和 Louis Wasserman 的出色回答,我提出了以下实现,它似乎运行良好:
function getNumberParts(x) {
if(isNaN(x)) {
return {mantissa: -6755399441055744, exponent: 972};
}
var sig = x > 0 ? 1 : -1;
if(!isFinite(x)) {
return {mantissa: sig * 4503599627370496, exponent: 972};
}
x = Math.abs(x);
var exp = Math.floor(Math.log(x)*Math.LOG2E)-52;
var man = x/Math.pow(2, exp);
return {mantissa: sig*man, exponent: exp};
}
【问题讨论】:
-
您的解决方案对我来说似乎有风险。特别是,我非常怀疑
Math.log(x) * Math.LOG2E中的小舍入错误会给你类似5.99999996和floor将其截断为5。继续自己做对数;它不太容易出现舍入错误。 -
@LouisWasserman:这是一个很好的观点;我最好这样做。谢谢!
标签: javascript math haskell ghc ieee-754