Sebagai contoh,
int result;
result = 125/100;
atau
result = 43/100;
Apakah hasilnya akan selalu menjadi dasar divisi? Apa perilaku yang didefinisikan?
"I just throw the dam fraction part in the trash and move on with life"
Sebagai contoh,
int result;
result = 125/100;
atau
result = 43/100;
Apakah hasilnya akan selalu menjadi dasar divisi? Apa perilaku yang didefinisikan?
"I just throw the dam fraction part in the trash and move on with life"
Jawaban:
Apakah hasilnya akan selalu menjadi dasar divisi? Apa perilaku yang didefinisikan?
Ya, hasil bagi bilangan bulat dari dua operan.
6.5.5 Operator multiplikasi
6 Ketika bilangan bulat dibagi, hasil / operator adalah hasil bagi aljabar dengan setiap bagian pecahan dibuang. 88) Jika hasil bagi a / b dapat diwakili, ungkapan (a / b) * b + a% b harus sama dengan a.
dan catatan kaki yang sesuai:
88) Ini sering disebut '' pemotongan menuju nol ''.
Tentu saja dua hal yang perlu diperhatikan adalah:
3 Konversi aritmatika yang biasa dilakukan pada operan.
dan:
5 Hasil dari / operator adalah hasil bagi dari pembagian operan pertama oleh yang kedua; hasil dari operator% adalah sisanya. Dalam kedua operasi, jika nilai operan kedua adalah nol, perilaku tidak terdefinisi.
[Catatan: Tekankan milikku]
(a / b) * b + a % b == a
harus dipenuhi, dan nilai absolut dari a % b
harus kurang dari a
, tetapi apakah a % b
negatif untuk negatif a
atau b
tidak ditentukan.
Dirkgently memberikan deskripsi yang sangat baik tentang divisi integer di C99, tetapi Anda juga harus tahu bahwa di divisi integer C89 dengan operan negatif memiliki arah implementasi yang ditentukan.
Dari draft ANSI C (3.3.5):
Jika salah satu operan negatif, apakah hasil dari operator / adalah bilangan bulat terbesar kurang dari hasil bagi aljabar atau bilangan bulat terkecil yang lebih besar dari hasil aljabar yang ditentukan implementasi, seperti tanda hasil dari% operator. Jika hasil bagi a / b dapat diwakili, ungkapan (a / b) * b + a% b harus sama dengan a.
Jadi hati-hati dengan angka negatif ketika Anda terjebak dengan kompiler C89.
Itu adalah fakta yang menyenangkan bahwa C99 memilih pemotongan ke nol karena itulah cara FORTRAN melakukannya. Lihat pesan ini di comp.std.c.
reliable integer division
sebagai fitur bahasa baru. Luar biasa *-*
.
expr1 / expr2
dan expr1 % expr2
harus konsisten satu sama lain ketika kedua contoh expr1
menggabungkan objek yang sama dengan cara yang sama, dan juga untuk expr2
, tetapi pilihan pemotongan divisi versus pembagian lantai dinyatakan tidak ditentukan. Itu akan memungkinkan pembuatan kode yang lebih efisien tanpa melanggar banyak kompatibilitas (dan implementasi dapat mendokumentasikan perilaku spesifik jika cenderung)
Di mana hasilnya negatif, C memotong ke arah 0 daripada lantai - Saya belajar bacaan tentang mengapa divisi integer Python selalu lantai di sini: Mengapa Lantai Divisi Integer Python
filtered = (k - 1) * filtered + value + carry; carry = filtered % factor; filtered /= factor
diulangi dengan perubahan nilai value
. Itu membuat pendekatan integer yang bagus untuk filter lowpass orde pertama dengan konstanta waktu k
... tapi itu hanya simetris jika divisi memotong dan carry
mendapatkan nilai negatif. Kedua perilaku untuk pembagian berguna dari waktu ke waktu.
div
operator divisi lantai dan factor
aneh, maka filtered += (filter+(factor div 2)) div factor
akan menghasilkan perilaku bersih dan simetris untuk semua nilai hingga INT_MAX-(factor div 2)
.
Ya, hasilnya selalu terpotong ke nol. Ini akan membulatkan ke arah nilai absolut terkecil.
-5 / 2 = -2
5 / 2 = 2
Untuk nilai yang ditandatangani tidak ditandatangani dan tidak negatif, ini sama dengan lantai (pembulatan menuju -Infinity).
Apakah hasilnya akan selalu menjadi dasar divisi?
Tidak. Hasilnya bervariasi, tetapi variasi hanya terjadi untuk nilai negatif.
Apa perilaku yang didefinisikan?
Untuk membuatnya jelas putaran lantai menuju infinity negatif, sedangkan putaran divisi integer menuju nol (terpotong)
Untuk nilai positif, keduanya sama
int integerDivisionResultPositive= 125/100;//= 1
double flooringResultPositive= floor(125.0/100.0);//=1.0
Untuk nilai negatif ini berbeda
int integerDivisionResultNegative= -125/100;//=-1
double flooringResultNegative= floor(-125.0/100.0);//=-2.0
Saya tahu orang-orang telah menjawab pertanyaan Anda tetapi dalam istilah awam:
5 / 2 = 2
// karena keduanya 5 dan 2 adalah bilangan bulat dan divisi bilangan bulat selalu memotong desimal
5.0 / 2 or 5 / 2.0 or 5.0 /2.0 = 2.5
// di sini 5 atau 2 atau keduanya memiliki desimal maka hasil bagi Anda akan mendapatkan dalam desimal.