簡體   English   中英

機器Epsilon精度差異

[英]Machine Epsilon precision discrepancy

我試圖計算C ++中雙打和浮點數的機器epsilon值,作為學校作業的一部分。 我在Windows 7中使用Cygwin,64位,這里是代碼:

#include <iostream>

int main() {
    double epsilon = 1;
    while(1 + epsilon > 1)
        epsilon = epsilon / 2;
    epsilon = 2*epsilon;

    std::cout << epsilon << std::endl;

    float epsilon_f = 1;
    while(1 + epsilon_f > 1)
        epsilon_f = epsilon_f / 2;
    epsilon_f = 2*epsilon_f;

    std::cout << epsilon_f << std::endl;

    return 1;
}

當我運行代碼時,我收到兩個值的1.0842e-019。 我查了一下,應該得到2.22e-16的雙倍,1.19e-07的浮動值。 當我在Macbook上運行完全相同的代碼時,代碼返回正確的值。 什么可能導致我的Windows機器出現差異?

CPU的浮點寄存器通常包含80位 ,看起來Cygwin編譯器選擇完全在寄存器中執行循環計算(在打印結果時僅將結果截斷為32/64位)。

作為@Potatoswatter指出,這是編譯器完全合法,你的程序實際上呈現出不確定的行為,因為它假定一個精確的限制。 由於存在未定義的行為,編譯器可能會選擇將程序轉換為任何想要的程序(包括刪除所有文件的程序,但幸運的是,這不是常見的解決方案......)

PS歡迎來到StackOverflow,並且對於一個問題(如果您閱讀了答案中的概念)可能會讓您了解有關處理器架構和編譯器的更多信息,而不是同類課程中的任何人! :-)

暫無
暫無

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

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