C, a ve b tamsayı bölümü ile a/b arasında bir fark var mı? Daha spesifik olarak her iki süreçte ne olur?C Tam sayı bölmesi ve kat
cevap
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.
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.
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
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
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.
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
Ah, 'C' etiketini kaçırdı. Yine de, cevabımın C++ ile ilgili olduğu açıktır. ' –
@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