在C中,a和b是整數的整數除法a/b和floor(a/b)之間是否有區別? 更具體地說,在這兩個過程中會發生什麼?C整數除法和地板
C整數除法和地板
回答
a/b
做整數除法。如果a
或b
爲負數,結果取決於編譯器(在C99之前舍入可以趨近於零或朝向負無窮大;在C99 +中,舍入趨於0)。結果爲int
。 floor(a/b)
執行相同的除法,將結果轉換爲double,丟棄(不存在的)小數部分,並將結果返回爲double。
floor
返回double
而a/b
其中兩個a
和b
是整數得到的整數值。
使用正確的投射值是相同的。
如果typeof
操作用C存在(事實並非如此),我們將有:
(typeof (a /b)) floor(a/b) == a/b
編輯:如果現在的問題是:是否有任何區別:
(double) (a/b)
和
floor(a/(double) b)
答案是肯定的。結果在負值方面有所不同。
可能會丟失從整數轉換爲浮點的信息。不太可能與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
double可以精確地存儲所有32位整數值。你總是可以使用double而不是int。不僅不可能失去精確性,而且不可能。你的例子是正確的,但卻誤導了那些不瞭解問題的人。 – maxy
在一般情況下,假定整數是兩個整數表示的和浮點類型,有ISN沒有什麼不同,但證據並不明顯。問題在於,在浮點中,在分區a/b中發生舍入,因此底層函數不適用於確切的有理值,而是應用於近似值。我寫了一篇論文:https://www.vinc17.net/research/publi.html#Lef2005b
總之,我得到的結果是,如果a - b在浮點系統中是完全可表示的,那麼floor(a/b),其中a和b b是浮點數(帶整數值),給出了與整數除法a/b相同的結果。
- 1. 地板整數除法
- 2. 整數除法用C
- 3. 整數除法和在JavaScript
- 4. 整數除法和零
- 5. C++最好的方法來獲得整數除法和餘數
- 6. C++整數除法到浮點數
- 7. 整數推廣,C++和模板
- 8. 整數除法
- 9. 整數除法
- 10. MIPS:整數乘法和除法
- 11. 整數除零C++
- 12. 鑄造整數除法爲雙用C
- 13. 整數除法優化MSVC C++
- 14. Python3整數除法
- 15. 長整數除法
- 16. SSE整數除法?
- 17. C++整數除法如何工作限制和負值?
- 18. ARM整數除法算法
- 19. 小數整數除法
- 20. 整數IP地址 - C
- 21. 整數除法,並獲得整數值
- 22. 整數除法與常規除法
- 23. 整數和C++中
- 24. 整數和用C
- 25. C++ 0xC0000094:零除以整數除
- 26. C++ typedef和模板語法?
- 27. 整數除法屬性
- 28. 整數除法與舍入
- 29. 整數除法,舍入
- 30. awk中的整數除法
在C整數除法執行零截斷。在C99之前,這是事實確定的。 – ouah
啊,錯過了'C'標籤。不過,很明顯,我的答案是關於C++的。 '' –
@Mysticial問題是'floor'不會在這個例子中捨去任何東西,因爲'a/b'執行整數除法,然後*然後*將它傳遞給'floor'。 – oldrinb