簡體   English   中英

無法在Java中按位進行或運算(雙精度),也可能在JavaScript中

[英]Bitwise operation OR on (double) in Java not possible, possible in JavaScript

這是Google Chrome Javascript控制台的輸出。
http://i.stack.imgur.com/gefcZ.png

這是DrJava Java控制台的輸出。
http://i.stack.imgur.com/bQ7hS.png

我的Javascript代碼是

(baseCPUCyclesPerIteration - CPUCyclesTotalRoundoff) | 0

如果兩個變量都是整數,則似乎可以在Java中很好地編譯,但顯然在javascript中它們是雙精度型。 即使

typeof baseCPUCyclesPerIteration顯示"number"

結果使它很明顯是雙重數據類型。 我不明白為什么按位OR 0可以在Java語言的double中工作,但不能在Java double上工作。

似乎目的| 0 | 0只是修剪double數據類型中的小數點。 我猜在Java中等效的將是(int)(long)強制轉換正確嗎? 或按位| 0 | 0不只是在javascript中修整小數點嗎?

編輯:ya | 0 | 0不僅在javascript中修剪,還運行了它。 8899811111.111113453456754645 | 0 8899811111.111113453456754645 | 0回來了309876519
(盡管我通過了雙精度限制,但大聲笑仍然嘗試在javascript中進行計算,但我猜這是溢出發生的地方)。

在javascript中,所有按位運算符都將十進制數字轉換為32位整數。 對於正數,它的作用就像floor ;對於負數,它的作用就像ceil 諸如|0~~類的東西通常用作在JavaScript中將數字轉換為整數的技巧。

為了解釋您看到的溢出,我們可以查看有關Javascript如何將數字轉換為int32的規范: http : //es5.github.io/#x9.5

抽象運算ToInt32將其參數轉換為2 ^ 31到2 ^ 31-1(含)范圍內的2 ^ 32整數值之一。 此抽象操作的功能如下:

  1. number為在輸入參數上調用ToNumber的結果。
  2. 如果number為NaN,+ 0,-0,+∞或-∞,則返回+0。
  3. posInt為sign(number)* floor(abs(number))。
  4. int32bitposInt模2 ^ 32; 也就是說,Number類型的有限整數值k具有正號並且大小小於2 ^ 32,因此posInt和k的數學差為2 ^ 32的整數倍。
  5. 如果int32bit大於或等於2 ^ 31,則返回int32bit -2 ^ 32,否則返回int32bit

因此,要重現此行為,您將必須重現此邏輯。

編輯:這是Mozilla的Rhino引擎在Java中的工作方式:(根據user3435580提供的github鏈接)

public static int toInt32(double d) {
    int id = (int)d;
    if (id == d) {
        // This covers -0.0 as well
        return id;
    }

    if (d != d
        || d == Double.POSITIVE_INFINITY
        || d == Double.NEGATIVE_INFINITY)
    {
        return 0;
    }

    d = (d >= 0) ? Math.floor(d) : Math.ceil(d);

    double two32 = 4294967296.0;
    d = Math.IEEEremainder(d, two32);
    // (double)(long)d == d should hold here

    long l = (long)d;
    // returning (int)d does not work as d can be outside int range
    // but the result must always be 32 lower bits of l
    return (int)l;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM