Apakah saya salah melakukan modulus? Karena di jawa -13 % 64
seharusnya di evaluasi -13
tapi saya dapatkan 51
.
%
adalah operator sisa.
Apakah saya salah melakukan modulus? Karena di jawa -13 % 64
seharusnya di evaluasi -13
tapi saya dapatkan 51
.
%
adalah operator sisa.
Jawaban:
Kedua definisi modulus bilangan negatif digunakan - beberapa bahasa menggunakan satu definisi dan beberapa bahasa lainnya.
Jika Anda ingin mendapatkan angka negatif untuk input negatif, Anda dapat menggunakan ini:
int r = x % n;
if (r > 0 && x < 0)
{
r -= n;
}
Demikian juga jika Anda menggunakan bahasa yang mengembalikan angka negatif pada masukan negatif dan Anda lebih suka positif:
int r = x % n;
if (r < 0)
{
r += n;
}
x % y
, A) jika x
negatif sisanya negatif, yaitu x % y == -(-x % y)
. B) tanda y
tidak berpengaruh yaitux % y == x % -y
Karena "secara matematis" keduanya benar:
-13 % 64 = -13 (on modulus 64)
-13 % 64 = 51 (on modulus 64)
Salah satu opsi harus dipilih oleh pengembang bahasa Java dan mereka memilih:
tanda hasilnya sama dengan tanda dividen.
Mengatakannya dalam spesifikasi Java:
https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.17.3
-13 % 64 = 51
ketika saya mengharapkan -13
?".
int result = (-5) % 3;
memberikan -2. int result = (-3) % 5;
memberikan -3. Secara umum, int result = (-a) % b;
memberikan jawaban yang benar saat | -a | > b. Untuk mendapatkan hasil yang tepat saat | -a | <b kita harus membungkus pembagi. int result = ((-a) % b) + b;
untuk negatif a atau int result = (((-a) % b) + b) % b;
untuk positif atau negatif a
Hasil Anda salah untuk Java. Berikan beberapa konteks bagaimana Anda sampai padanya (program Anda, implementasi dan versi Java).
15.17.3 Operator Sisa%
[...]
Operasi sisa untuk operan yang merupakan bilangan bulat setelah promosi numerik biner (§5.6.2) menghasilkan nilai hasil sehingga (a / b) * b + (a% b) sama dengan Sebuah.
15.17.2 Operator Divisi /
[...]
Divisi integer membulatkan ke arah 0.
Karena / dibulatkan menuju nol (menghasilkan nol), hasil% harus negatif dalam kasus ini.
int result = (-5) % 3;
memberi -2 int result = (-3) % 5;
memberi -3 Secara umum, int result = (-a) % b;
memberikan jawaban yang benar jika | -a | > b Untuk mendapatkan hasil yang tepat saat | -a | <b kita harus membungkus pembagi. int result = ((-a) % b) + b;
untuk negatif a atau int result = (((-a) % b) + b) % b;
untuk positif atau negatif a.
(-3) % 5
, hasil yang benar menurut definisi adalah -3
, dan implementasi Java yang benar akan menghasilkan hasil itu.
(-3)%5
memang memberi -3
, dan jika kita menginginkan sisa positif kita harus menambahkan 5 padanya, dan kemudian hasilnya adalah2
kamu bisa memakai
(x % n) - (x < 0 ? n : 0);
((x % k) + k) % k
. (Meskipun milik Anda mungkin lebih mudah dibaca.)
[0, sign(divisor) * divisor)
bukan [0, sign(dividend) * divisor)
.
Jawaban Anda ada di wikipedia: operasi modulo
Dikatakan, bahwa di Jawa tanda operasi modulo sama dengan dividen. dan karena kita berbicara tentang operasi pembagian lainnya baik-baik saja, ia mengembalikan -13 dalam kasus Anda, karena -13/64 = 0. -13-0 = -13.
EDIT: Maaf, salah paham pertanyaan Anda ... Anda benar, java harus memberikan -13. Bisakah Anda memberikan lebih banyak kode sekitarnya?
Aritmatika modulo dengan operan negatif ditentukan oleh perancang bahasa, yang mungkin menyerahkannya pada implementasi bahasa, yang mungkin akan menunda definisi ke arsitektur CPU.
Saya tidak dapat menemukan definisi bahasa Java.
Terima kasih Ishtar, Spesifikasi Bahasa Java untuk Operator Sisa% mengatakan bahwa tanda hasil sama dengan tanda pembilang.
x = x + m = x - m
dalam modulus m
.
jadi -13 = -13 + 64
di modulus 64
dan -13 = 51
di modulus 64
.
asumsikan Z = X * d + r
, jika 0 < r < X
kemudian di divisi Z/X
kita sebut r
sisanya.
Z % X
mengembalikan sisa Z/X
.
Fungsi mod didefinisikan sebagai jumlah yang melebihi kelipatan bilangan bulat terbesar dari pembagi yang tidak lebih besar dari bilangan tersebut. Jadi dalam kasus Anda
-13 % 64
kelipatan bilangan bulat terbesar dari 64 yang tidak melebihi -13 adalah -64. Sekarang, jika Anda mengurangi -13 dari -64, hasilnya menjadi 51-13 - (-64) = -13 + 64 = 51
Dalam versi saya Java JDK 1.8.0_05 -13% 64 = -13
Anda bisa mencoba -13- (int (-13/64)) dengan kata lain melakukan pembagian dilemparkan ke bilangan bulat untuk menghilangkan bagian pecahan kemudian mengurangi pembilang Jadi pembilang- (int (pembilang / penyebut)) harus memberikan yang benar sisa & tanda tangan
Di Java versi terbaru yang Anda dapatkan -13%64 = -13
. Jawabannya akan selalu bertanda pembilang.
Menurut bagian 15.17.3 dari JLS, "Operasi sisa untuk operand yang merupakan bilangan bulat setelah promosi numerik biner menghasilkan nilai hasil sehingga (a / b) * b + (a% b) sama dengan a. Identitas ini berlaku genap dalam kasus khusus bahwa pembagi adalah bilangan bulat negatif dari kemungkinan besar terbesar untuk tipenya dan pembaginya -1 (sisanya adalah 0). "
Semoga membantu.
Saya tidak berpikir Java mengembalikan 51 dalam kasus ini. Saya menjalankan Java 8 di Mac dan saya mendapatkan:
-13 % 64 = -13
Program:
public class Test {
public static void main(String[] args) {
int i = -13;
int j = 64;
System.out.println(i % j);
}
}