[英]C integer division and floor
在C中,整數除法a / b與floor(a / b)之間是否存在差異,其中a和b都是整數? 更具體地說,在兩個過程中發生了什
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
一般來說,假設整數和浮點類型都可以表示整數,沒有區別,但證明並不明顯。 問題是在浮點數中,在分區a / b中發生舍入,因此floor函數不適用於精確的有理值,而是應用於近似值。 我寫了一篇關於這個主題的論文: https : //www.vinc17.net/research/publi.html#Lef2005b
簡而言之,我得到的結果是,如果a-b在浮點系統中是完全可表示的,那么floor(a / b),其中a和b是浮點數(帶整數值),給出與整數除法a / b相同的結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.