2017-02-10 22 views
2

我在parC中遇到了這個代碼。parC int分區向上舍入

enter image description here

enter image description here

我不明白其中的場景(黃色標記),它可以發生? 我的意思是什麼時候分區的結果可以四捨五入當值類型是詮釋

回答

2

我對parC一無所知,但就C而言,你是對的:正值的整數除法被定義爲截斷小數部分,即舍入爲零。

但是,代碼中存在另一個錯誤:如果數組太長,則中點可能計算錯誤。

準確地說,如果初始to是大2或大於最大值的可表示的一半在int類型(INT_MAX),然後遞歸調用中的一個將得到fr, to值都大於(INT_MAX/2)和表達式(to+fr)將導致算術溢出。 (to+fr)/2的結果將小於fr/2

爲避免這種情況,推薦使用如fr + (to - fr)/2這樣的表達式,而不是(to + fr)/2

編輯

也有描述錯誤!查看圖片:

enter image description here

(4,5)→(4,5)遞歸發生一個級別早於作者指出,這樣一個子樹不應該實際出現在圖中。另外,如果程序卡在紅色箭頭循環中,則(6,5)遞歸永遠不會發生 - 該進程將永遠不會到達該分支。

有趣的是,作者顯然忽略了另一個循環出現在他們的圖畫中;
遞歸(1,2)→(1,2)甚至早於上述這兩個出現:

enter image description here

作爲邊注,我無法想象他們是如何獲得的劃分的兩種不同的結果(4,5)→(4,5)+(6,5)和(4,5)→(4,5)+(5,5)
(見綠框)。可能他們是如此專注於強迫思考,忽略了關於問題所有其他方面的任何推理。

基於這個例子,我建議把這本書放在垃圾桶裏。

1

你說得對,C中正操作數的整數除法總是四捨五入至分區的樓層,查詢this question瞭解更多細節。我對parC不熟悉,但據說它是full C++ language以及來自其他語言的附加內容,所以描述的任務似乎不正確。

如果還有問題,您總是有機會直接檢查任務:爲parC設置environment,執行rsum()並執行rsum(A, 1, 5)

1

您可能正在閱讀的文字大於18年。 在舊版本的C標準中,負操作數的除法可以以實現定義的方式進行四捨五入:向下或向上。這意味着-3/2可能會給你-1-2取決於編譯器。

這被認爲是該語言的設計缺陷,並已通過C99標準進行了修正。如今,無論編譯器如何,C總是使用「截至零」。

+0

有趣的版本,但圖2.17顯示了積極操作數的無窮遞歸,所以情況並非如此。 –