簡體   English   中英

C整數除法和樓層

[英]C integer division and floor

在C中,整數除法a / b與floor(a / b)之間是否存在差異,其中a和b都是整數? 更具體地說,在兩個過程中發生了什

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

floor返回一個doublea / b ,其中ab都是整數,產生一個整數值。

使用正確的強制轉換,值是相同的。

如果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.

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