2012-09-02 160 views

回答

11

a/b做整數除法。如果ab爲負數,結果取決於編譯器(在C99之前舍入可以趨近於零或朝向負無窮大;在C99 +中,舍入趨於0)。結果爲intfloor(a/b)執行相同的除法,將結果轉換爲double,丟棄(不存在的)小數部分,並將結果返回爲double。

+2

在C整數除法執行零截斷。在C99之前,這是事實確定的。 – ouah

+0

啊,錯過了'C'標籤。不過,很明顯,我的答案是關於C++的。 '' –

+0

@Mysticial問題是'floor'不會在這個例子中捨去任何東西,因爲'a/b'執行整數除法,然後*然後*將它傳遞給'floor'。 – oldrinb

6

floor返回doublea/b其中兩個ab是整數得到的整數值。

使用正確的投射值是相同的。

如果typeof操作用C存在(事實並非如此),我們將有:

(typeof (a /b)) floor(a/b) == a/b 

編輯:如果現在的問題是:是否有任何區別:

(double) (a/b) 

floor(a/(double) b) 

答案是肯定的。結果在負值方面有所不同。

4

可能會丟失從整數轉換爲浮點的信息。不太可能與int和double,但略有改動:

#include <stdio.h> 
#include <math.h> 

int main(void) 
{ 
    unsigned long long a = 9000000000000000003; 
    unsigned long long b = 3; 
    printf("a/b = %llu\n", a/b); 
    printf("floor(a/b) = %f\n", floor(a/b)); 
    return 0; 
} 

結果:

a/b = 3000000000000000001 
floor(a/b) = 3000000000000000000.000000 
+1

double可以精確地存儲所有32位整數值。你總是可以使用double而不是int。不僅不可能失去精確性,而且不可能。你的例子是正確的,但卻誤導了那些不瞭解問題的人。 – maxy

1

在一般情況下,假定整數是兩個整數表示的和浮點類型,有ISN沒有什麼不同,但證據並不明顯。問題在於,在浮點中,在分區a/b中發生舍入,因此底層函數不適用於確切的有理值,而是應用於近似值。我寫了一篇論文:https://www.vinc17.net/research/publi.html#Lef2005b

總之,我得到的結果是,如果a - b在浮點系統中是完全可表示的,那麼floor(a/b),其中a和b b是浮點數(帶整數值),給出了與整數除法a/b相同的結果。