簡體   English   中英

零減零相當於無窮大?

[英]Zero minus zero equivalent to infinity?

我正在編寫一個方法來創建一個浮點數組的副本。 在調試之后,我得到了一些非常奇怪的值,所以我想我會問這個,因為我無法通過閱讀C ++數組常見問題解答這一點。

這是代碼的相關部分(它是一個龐大的程序的一部分,大部分內容與這篇文章無關):

// height and width are integer global variables
void method () {
    float testArray[height][width];
    for(int j = 0; j < height; ++j) {
        for(int i = 0; i < width; ++i) {
            testArray[j][i] -= 0.0;
            std::cout << testArray[j][i] << std::endl;
        }
    }
}

(在我的測試中,height = 32和width = 256,但這不應該是相關的。)當我初始化testArray時,它的值應該都是0.0,對嗎? 然后,在循環中,我從testArray中的某個元素中減去0.0,這在邏輯上根本不會改變該值。 但是將testArray的值打印為調試步驟會產生一些奇怪的值,例如以下代碼段:

[...]
0
[...]
-3.23805e-24
[...]
8.40779e-45
[...]
1.79513e+37
[...]
0
[...]
3.19586e+36
[...]

最令人擔憂的值是無限值,例如上面列出的第四個數字。 老實說,我不知道為什么會這樣。 不是所有這些值都不應該大約為0.0嗎? 我認為這與浮點運算的不精確有關,但這不應該導致無限值....

不,當你聲明你的數組時,它將是未初始化的,因為它是內置類型。 在進行減法之前,您需要將其初始化為零。

但請注意,聲明一個數組(可能是非const維度)是編譯器擴展而不是語言的一部分。

我只想使用vector來解決這兩個問題。

std::vector<std::vector<float> > testArray(height, std::vector<float>(width));

嘗試初始化數組中的值:

float testArray[height][width] = {};

這一行創建一個未初始化的數組,元素值可以是任何垃圾:

float testArray[height][width];

要使用浮點默認值(零)初始化它,請使用以下語法:

float testArray[height][width] = {};

這個答案是錯的,但我離開它所以沒有人想到它!

使用這個非常明確的定義:

float testArray[height][width] = {{0.0f}};

確保將數組中的每個值初始化為零。 否則,數組中的值將是未定義的。 我覺得這是最“可讀”的解決方案。

為什么錯了?

正如@Dave在下面提到的那樣,盡管這種解決方案適用於這種情況,但它具有誤導性。 它只將testArray 的第一個元素明確指定為0.0,同時它初始化數組中的所有其他元素。

確實是正確的解決方案:

float testArray[height][width] = {};

value初始化數組中的所有元素(對於float類型,默認值為0.0f

暫無
暫無

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

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