2012-09-02 20 views

cevap

11

a/b tamsayı bölümü yapmaz. a veya b ya negatifse, sonuç derleyiciye bağlıdır (C99 öncesinde yuvarlama sıfıra doğru veya negatif sonsuzluğa gidebilir; C99 + 'da, yuvarlama 0'a gider). Sonuç, int türüne sahiptir. floor(a/b) aynı bölümü yapar, sonucu ikiye dönüştürür, (varolmayan) kesirli parçayı atar ve sonucu çift olarak döndürür.

+2

C tamsayı bölümünde, kesime sıfıra doğru gerçekleştirir. Bu, uygulama tanımlı olmadan önce C99'dan beri geçerlidir. – ouah

+0

Ah, 'C' etiketini kaçırdı. Yine de, cevabımın C++ ile ilgili olduğu açıktır. ' –

+0

@Mysticial noktası şu ki, bu durumda 'zemin' hiçbir şey yuvarlamadığı için 'a/b' tamsayı bölüştürür ve * sonra * 'katına' iletir. – oldrinb

6

floor döndüren bir double hem a ve b tamsayı bir tamsayı değeri verir a/b ise.

Doğru yayınlamada, değer aynıdır. typeof operatörü (öyle değil) C varolan

Eğer biz olurdu: Soru Şimdi eğer: DÜZENLEME

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

(double) (a/b) 

ve: arasında herhangi bir fark yoktur Cevap evet. Sonuçlar negatif değerlere göre farklılık göstermektedir.

4

Tam sayıdan kayan noktaya dönüştürme bilgilerini kaybedebilirsiniz. int ve double ile muhtemel değil, ama biraz değiştirme ile:

#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; 
} 

Sonuç:

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

Bir çift, 32 bit tamsayı değerlerini tam olarak kaydedebilir. Her zaman int yerine double kullanabilirsiniz. Kesinliği kaybetmek pek olası değil, imkansız. Örneğiniz doğru, ama henüz problemi anlamayan yanıltıcı insanlar. – maxy

1
tamsayılar tamsayı hem sunulabilen olduklarını varsayarak Genelde

ve kayan nokta tipleri, orada değil Bir fark yok, ama kanıt belli değil. Sorun, kayan noktalarda, a/b bölümündeki bir yuvarlamanın meydana gelmesidir, bu yüzden zemin fonksiyonu tam olarak rasyonel değerde değil, yaklaşık bir değerde uygulanmaktadır. Konuyla ilgili bir yazı yazmıştım: https://www.vinc17.net/research/publi.html#Lef2005b

Kısacası, elde ettiğim sonuç a - b'nin kayan nokta sisteminde tam olarak temsil edilebiliyorsa, o zaman (a/b), a ve b kayan noktalı sayılar (tamsayı değerleriyle), tamsayı bölümü a/b ile aynı sonucu verir.