Modülü yanlış mı yapıyorum? Çünkü Java'da -13 % 64
değerlendirmek gerekiyor -13
ama anlıyorum 51
.
%
kalan operatördür.
Modülü yanlış mı yapıyorum? Çünkü Java'da -13 % 64
değerlendirmek gerekiyor -13
ama anlıyorum 51
.
%
kalan operatördür.
Yanıtlar:
Negatif sayı modülünün her iki tanımı da kullanımdadır - bazı diller bir tanımı, diğerini kullanır.
Negatif girişler için negatif bir sayı elde etmek istiyorsanız, bunu kullanabilirsiniz:
int r = x % n;
if (r > 0 && x < 0)
{
r -= n;
}
Aynı şekilde, negatif bir girişte negatif bir sayı döndüren bir dil kullanıyor olsaydınız ve pozitif tercih edersiniz:
int r = x % n;
if (r < 0)
{
r += n;
}
x % y
, A) x
negatifse geri kalan negatiftir, yani x % y == -(-x % y)
. B) işaretinin y
etkisi yoktur, yanix % y == x % -y
"Matematiksel olarak" her ikisi de doğru olduğundan:
-13 % 64 = -13 (on modulus 64)
-13 % 64 = 51 (on modulus 64)
Seçeneklerden birinin Java dili geliştiricileri tarafından seçilmesi gerekiyordu ve onlar şunları seçti:
sonucun işareti temettü işaretine eşittir.
Java özelliklerinde diyor ki:
https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.17.3
-13 % 64 = 51
bekliyordum neden bana veriyor -13
?".
int result = (-5) % 3;
-2 verir. int result = (-3) % 5;
-3 verir. Genel olarak int result = (-a) % b;
| -a | olduğunda doğru cevabı verir. > b. Doğru sonucu almak için | -a | <b böleni sarmalıyız. int result = ((-a) % b) + b;
negatif a veya int result = (((-a) % b) + b) % b;
pozitif veya negatif için a
Java için sonucunuz yanlış. Lütfen ona nasıl ulaştığınız hakkında biraz bilgi verin (programınız, uygulamanız ve Java sürümü).
Gönderen Java Dil Şartnamede
15.17.3 Kalan Operatör%
[...]
İkili sayısal yükseltmeden (§5.6.2) sonra tamsayı olan işlenenler için kalan işlem, (a / b) * b + (a% b) 'ye eşit olacak şekilde bir sonuç değeri üretir. a.
15.17.2 Bölüm İşleci /
[...]
Tamsayı bölme 0'a doğru yuvarlanır .
/ Sıfıra yuvarlandığından (sıfırla sonuçlanır), bu durumda% sonucunun negatif olması gerekir.
int result = (-5) % 3;
-2 int result = (-3) % 5;
verir -3 verir Genelde int result = (-a) % b;
| -a | olduğunda doğru cevabı verir. > b | -a | olduğunda doğru sonucu almak için <b böleni sarmalıyız. int result = ((-a) % b) + b;
negatif a veya int result = (((-a) % b) + b) % b;
pozitif veya negatif için a.
(-3) % 5
tanıma göre doğru sonuçtur -3
ve Java'nın doğru bir şekilde uygulanması bu sonucu vermelidir.
(-3)%5
gerçekten verir -3
ve eğer pozitif kalanı istiyorsak, buna 5 eklemeliyiz ve o zaman sonuç şöyle olacaktır2
kullanabilirsiniz
(x % n) - (x < 0 ? n : 0);
((x % k) + k) % k
. (Sizinki muhtemelen daha okunaklı olsa da)
[0, sign(divisor) * divisor)
yerine aralığında olmasını istediğinizde yararlıdır [0, sign(dividend) * divisor)
.
Cevabınız wikipedia'da: modulo işlemi
Java'da modulo işlemindeki işaretin temettü işlemiyle aynı olduğunu söylüyor. ve bölme işleminin geri kalanından bahsettiğimiz için gayet iyi, sizin durumunuzda -13, -13/64 = 0. -13-0 = -13 olduğundan -13 döndürüyor.
DÜZENLEME: Üzgünüm, sorunuzu yanlış anladım ... Haklısınız, java -13 vermeli. Daha fazla çevre kodu sağlayabilir misiniz?
Negatif işlenenlerle modülo aritmetiği, onu dil gerçeklemesine bırakabilecek olan ve tanımı CPU mimarisine erteleyebilecek olan dil tasarımcısı tarafından tanımlanır.
Bir Java dili tanımı bulamadım.
Teşekkürler Ishtar, Kalan Operatör için Java Dil Spesifikasyonu % sonucun işaretinin payın işaretiyle aynı olduğunu söylüyor.
x = x + m = x - m
modülde m
.
yani -13 = -13 + 64
modül 64
ve -13 = 51
modül olarak 64
.
Varsayalım Z = X * d + r
, eğer 0 < r < X
bölünmede kalanı Z/X
çağırırsak r
.
Z % X
kalanını döndürür Z/X
.
Mod işlevi, bir sayının bölenin o sayıdan büyük olmayan en büyük tam sayı katını aştığı miktar olarak tanımlanır. Yani senin durumunda
-13 % 64
64'ün -13'ü geçmeyen en büyük tamsayı katı -64'tür. Şimdi, -64'ten -13'ü çıkardığınızda 51'e eşittir-13 - (-64) = -13 + 64 = 51
Java JDK 1.8.0_05 -13% 64 = -13 sürümümde
-13- (int (-13/64)) deneyebilirsiniz, başka bir deyişle, kesir kısmından kurtulmak için bir tamsayıya bölme yapın ve sonra paydan çıkarın Bu yüzden pay- (int (pay / payda)) doğru vermelidir kalan ve işaret
Java'nın son sürümlerinde alırsınız -13%64 = -13
. Cevap her zaman pay işaretine sahip olacaktır.
JLS'nin 15.17.3 bölümüne göre, "İkili sayısal yükseltmeden sonra tamsayı olan işlenenler için kalan işlem, (a / b) * b + (a% b) a'ya eşit olacak şekilde bir sonuç değeri üretir. Bu kimlik çift tutar özel durumda, temettü türü için olası en büyük büyüklüğe sahip negatif tamsayı ve bölen -1'dir (kalan 0'dır). "
Umarım yardımcı olur.
Java'nın bu durumda 51 döndürdüğünü sanmıyorum. Mac'te Java 8 çalıştırıyorum ve şunu alıyorum:
-13 % 64 = -13
Program:
public class Test {
public static void main(String[] args) {
int i = -13;
int j = 64;
System.out.println(i % j);
}
}