[英]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++ 編碼的開源項目(例如FLTK 、 RefPerSys 、 Ghudi 、 Qt 、 ninja等等......)。 花一些時間研究他們的源代碼(以獲得靈感)
關於浮點運算不要忘記閱讀浮點指南。
考慮(如果允許)在您的代碼上使用Clang static 分析器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.