簡體   English   中英

C++ 中的錯誤添加

[英]Wrong addition in C++

double *out;
int size = size1+size2;
string s = "";
int c = 0;
int curr = 0;
for(int i=size-2; i >= 0; i--) {
    cout << "\nP: " << out[i]/size << "\n";
    cout << "Carry: " << c <<"\n";
    curr = out[i]/size + c;
    s += char(curr%10 + '0');
    cout << "Out: " << curr <<"\n";
    c = curr / 10;
}

在這個片段中,我試圖將“P”( out[I]/size )和“Carry”( c )添加到“Out”( curr )中。 正如您在 41 和 2 的 output 中看到的那樣,加法結果是 42。有人可以解釋一下嗎?

Output:

P:20 進位:0 出:20

P:41 進位:2 出:42

P:37 進位:4 出:40

P:43 進位:4 出局:47

P:49 進位:4 出局:53

P:83 進位:5 出局:88

回顧一下由於out是一個未初始化的指針,這不是一個格式良好的代碼示例這一事實,我敢肯定您只是將它放在那里進行說明,而不是實際演示您的實際代碼。

但是無論如何,如果您正在進行浮點除法( out[i] / size就是這種情況),那么當您使用std::cout output 時,它會將其四舍五入為 output 精度。 實際上,它可能略小於或略大於 41。

同樣,當您獲取該值並添加c時,您會得到相同的結果:浮點值可能略大於或略小於 43。當您現在將其截斷為 integer 時,如果它小於 43,則該值將變為 42 .

嘗試這個:

curr = static_cast<int>(std::round(out[i] / size + c));

在您的代碼中, out未初始化。 因此,您的代碼具有未定義的行為(因為該變量包含一些未知/不可預測的指針)。

如果您使用GCC編譯為g++ -Wall -Wextra -g ,您應該會收到一些警告。

你可以考慮編碼

int size = size1+size2;
double* out = new double [size];

然后使用所有警告和調試信息編譯您的程序,並使用調試器(如GDB )來了解可執行文件的行為。

花更多的時間閱讀一些好的C++ 參考和一些好的C++ 編程書

請務必閱讀 C++ 編譯器的文檔。 對於 GCC 它在這里 對於Clang它就在那里

您可以稍后閱讀一些 C++ 標准草案,例如n3337或從ISO購買最新的 C++ 標准。

您可以找到許多以 C++ 編碼的開源項目(例如FLTKRefPerSysGhudiQtninja等等......)。 花一些時間研究他們的源代碼(以獲得靈感)

關於浮點運算不要忘記閱讀浮點指南

考慮(如果允許)在您的代碼上使用Clang static 分析器

暫無
暫無

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

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