簡體   English   中英

ceil()和floor()函數在C ++中用於size_t類型

[英]ceil() and floor() functions in C++ for size_t types

我有兩個變量:

size_t a = 63;
size_t b = 32;

我調用了函數ceil(a/b) 當然我會假設答案返回2但是它返回1

我很困惑。 我已經嘗試將變量轉換為doubleint ,但它似乎沒有幫助。

謝謝你的幫助。

讓我們分解你做ceil(a/b)時發生的事情ceil(a/b) 首先,在a和b之間發生整數除法,因此63/62變為1,然后1被鑄造成雙倍變為1.0,然后ceil(1.0)當然只有1.0。

如果你期望得到2,你需要在除法發生之前轉換為double,即ceil(double(a) / double(b))使用雙除法。

ceilfloor函數適用於double類型。 你做了一個整數除法(因為size_t是一個整數類型),所以結果是一個整數( 它已經是一個整數,所以你不能向上或向下舍入)。 在分裂前嘗試施法double

ceil( double(a) / double(b) );
floor( double(a) / double(b) );

從技術上講,你只需要拋出第一個,因為那時你會得到浮點除法。 但要明確並投兩者都是好的。

63和32都是整數,因此結果將是int(即1而不是1.96875)。

或者由paddy或者指定的類型進行類型轉換

或使用雙值

ceil(63.0/32); // promotes 32 from int to double since one of the operand(63.0) is double.
ceil(63.0/32.0); // both operands are doubles

a/b將執行整數除法,因為它們是整數類型,這將導致1 ,這解釋了為什么std :: ceil返回您看到的值。 如果我們看一下C ++標准草案 5.6乘法運算符4段說( 強調我的 ):

二元/運算符產生商,二元%運算符從第一個表達式除以第二個表達式得到余數。 如果/或%的第二個操作數為零,則行為未定義。 對於積分操作數,/運算符產生代數商,丟棄任何小數部分 ; [...]

由於算術轉換將任一個操作數轉換為double,這將足以在第5表達式10段中說明( 強調我的 ):

許多期望算術或枚舉類型的操作數的二元運算符會以類似的方式引起轉換並產生結果類型 目的是產生一個通用類型,它也是結果的類型。 這種模式稱為通常的算術轉換 ,定義如下:

並包括這個子彈:

否則,如果任一操作數為double,則另一個操作數應轉換為double。

所以下面的表達式將產生你想要的結果:

std::ceil( double(a)/b)

暫無
暫無

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

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