【问题标题】:Preserving the floating point & addition of a bitwise operation in javascript在javascript中保留浮点并添加按位运算
【发布时间】:2012-05-06 21:33:25
【问题描述】:

我试图通过对位进行操作来了解加、减、除和乘的方法。

由于在事件发生后会运行许多计算,因此有必要在我的 JavaScript 程序中进行一些优化。

通过使用下面的代码作为参考,我能够理解进位包含 &ing 值。然后通过执行 XOr 将 sum var 设置为每个 n1 / n2 变量中不匹配的位。

这是我的问题。;) 将 (n1 & n2)

function add(n1,n2)
{
        var carry, sum;

        // Find out which bits will result in a carry.
        // Those bits will affect the bits directly to
        // the left, so we shall shift one bit.
        carry = (n1 & n2) << 1;

        // In digital electronics, an XOR gate is also known
        // as a quarter adder.  Basically an addition is performed
        // on each individual bit, and the carry is discarded.
        //
        // All I'm doing here is applying the same concept.
        sum = n1 ^ n2;

        // If any bits match in position, then perform the
        // addition on the current sum and the results of
        // the carry.
        if (sum & carry)
        {
                return add(sum, carry);
        }

        // Return the sum.
        else
        {
                return sum ^ carry;
        };
};

上面的代码按预期工作,但它不返回浮点值。我必须将总数与浮点值一起返回。

有没有人可以使用上面的函数来帮助我处理浮点值?是否有明确解释我要查找的内容的网站?我已经尝试搜索最后一天是如此,找不到任何可以查看的内容。

我从这个资源中得到了上面的代码。 http://www.dreamincode.net/code/snippet3015.htm

提前谢谢!

考虑一下左移到 1 的位置是乘以 2。

通过 &ing 像这样:carry = (n1 & n2) 进位变量将保存由 n1 和 n2 中的匹配位置编译而成的二进制字符串。因此,如果 n1 为 4 且 n2 为 4,则它们都具有相同的值。因此,通过将两者结合起来并右移到 1 索引将乘以 4 x 2 = 8;所以进位现在等于 8。

1.) var 进位 = 00001000 =8 & 00001000 =8

2.) 进位 = 现在保存单个值 00001000 =8

左移将乘以 8 x 2 =16,或 8 + 8 = 16

3.)carry = 进位

4.) 进位现在保存一个值 00010000 = 16

我仍然找不到任何有关使用浮点值的信息。如果有人有什么,请发布链接。

【问题讨论】:

  • 你真的不会通过编写更多代码来提高 FP 操作的速度。 FPU 已经高度优化并且与主 ALU 异步。您最好自己尝试改进计算。

标签: javascript floating-point bit-manipulation


【解决方案1】:

它不起作用,因为代码假定浮点数表示为整数,但事实并非如此。浮点数使用 IEEE 754 标准表示,该标准将数字分为三个部分:符号位,一组表示指数的位,另一组表示1(含)和2(不含)之间的数字,尾数,其值计算为

(sign is set ? 1 : -1) * (mantissa ^ (exponent - bias))

偏差取决于浮点数的精度。因此,您用于添加两个数字的算法假定这些位表示一个整数,而浮点数不是这种情况。诸如按位与和按位或之类的运算也不会给出您在整数世界中所期望的结果。

在一些示例中,在双精度中,数字 2.3 表示为(十六进制)4002666666666666,而数字 5.3 表示为 4015333333333333。对这两个数字进行或运算将得到 4017777777777777,它表示(大致)5.866666。

关于这种格式有一些很好的指导,我发现http://www.psc.edu/general/software/packages/ieee/ieee.phphttp://babbage.cs.qc.edu/IEEE-754/http://www.binaryconvert.com/convert_double.html 的链接非常有助于理解它。

现在,如果您仍想为这些数字实现按位加法,您可以。但是您必须将数字分解为各个部分,然后以相同的指数对数字进行归一化(否则您将无法添加它们),对尾数执行加法,最后将其归一化为 IEEE754格式。但是,正如@LukeGT 所说,您可能不会获得比您正在运行的 JS 引擎更好的性能。并且一些 JS 实现甚至不支持对浮点数的按位运算,所以通常最终发生的情况是它们首先将数字转换为整数,然后执行操作,这也会使您的结果不正确。

【讨论】:

  • 我将在几天后跟进这篇文章。谢谢。
【解决方案2】:

浮点值具有复杂的位结构,很难用位操作进行操作。因此,我怀疑在计算它们方面你能比 Javascript 引擎做得更好。浮点计算本质上很慢,所以如果你担心速度,你应该尽量避免它们。

尝试使用整数将十进制数表示为 x 位数。例如,如果您使用货币,您可以以整美分的形式存储事物,而不是使用小数值的美元。

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 2011-07-17
    • 2015-05-25
    • 2023-04-06
    • 1970-01-01
    • 2012-10-21
    • 2023-04-03
    • 2010-12-15
    • 2017-06-17
    • 1970-01-01
    相关资源
    最近更新 更多