簡體   English   中英

為什么在C ++和Java中此float操作會產生不同的結果?

[英]Why does this float operation in C++ and Java give different results?

我剛剛訪問了這個網站,並嘗試使用Java和C ++進行操作。 為什么用Java編寫以下內容會給出0.30000000000000004

double x = 0.1 + 0.2;
System.out.print(x);

而用C ++編寫以下代碼將得到0.3?

double x = 0.1 + 0.2;
cout<<x;

C ++標准不能保證使用IEEE 754浮點算法 ,因此實際上是實現定義的結果。 但是,大多數實現都會這樣做。

在Java中, floatdouble 被定義為IEEE 754浮點類型 另外,您可以將strictfp修飾符添加到類或方法聲明中,以要求即使對於中間結果也要使用嚴格的IEEE 754浮點算法。

在處理浮點數時,如有疑問,通常可以查看實際的位表示形式。

#include <cstdint>
#include <cstdio>

int
main()
{
  static_assert(sizeof(double) == sizeof(uint64_t), "wrong bit sizes");
  const double x = 0.1 + 0.2;
  const uint64_t bits = *reinterpret_cast<const uint64_t *>(&x);
  printf("C++:  0x%016lX\n", bits);
  return 0;
}
public final class Main {
    public static void main(final String[] args) {
        final double x = 0.1 + 0.2;
        final long bits = Double.doubleToLongBits(x);
        System.out.printf("Java: 0x%016X\n", bits);
    }
}

當我在計算機上執行兩個程序時(帶有GCC和OpenJDK的GNU / Linux),輸出為

C++:  0x3FD3333333333334
Java: 0x3FD3333333333334

這表明兩者產生的結果完全相同。 但是,可移植程序不應依賴於此。

在IEEE浮點表示中,0.1和0.2(或0.3)都不是精確值。 只有2的負冪及其組合是(例如0.5、0.25、0.75 ...)。

因此,您看到的差異只是Matt Adams所說的默認輸出格式的差異。

確定您的精度級別,並為輸出流專門設置精度級別,該精度級別應顯示為

暫無
暫無

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

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