क्या मैं मापांक गलत कर रहा हूँ? क्योंकि जावा -13 % 64
में मूल्यांकन करना है, -13
लेकिन मुझे मिलता है 51
।
%
एक शेष ऑपरेटर है।
क्या मैं मापांक गलत कर रहा हूँ? क्योंकि जावा -13 % 64
में मूल्यांकन करना है, -13
लेकिन मुझे मिलता है 51
।
%
एक शेष ऑपरेटर है।
जवाबों:
ऋणात्मक संख्याओं के मापांक की दोनों परिभाषाएँ उपयोग में हैं - कुछ भाषाएँ एक परिभाषा और कुछ अन्य का उपयोग करती हैं।
यदि आप नकारात्मक इनपुट के लिए ऋणात्मक संख्या प्राप्त करना चाहते हैं तो आप इसका उपयोग कर सकते हैं:
int r = x % n;
if (r > 0 && x < 0)
{
r -= n;
}
इसी तरह यदि आप एक ऐसी भाषा का उपयोग कर रहे हैं जो नकारात्मक इनपुट पर ऋणात्मक संख्या देता है और आप सकारात्मक पसंद करेंगे:
int r = x % n;
if (r < 0)
{
r += n;
}
x % y
, A) यदि x
ऋणात्मक है तो शेष ऋणात्मक है, अर्थात x % y == -(-x % y)
। बी) के हस्ताक्षर y
कोई प्रभाव नहीं अर्थातx % y == x % -y
"गणितीय रूप से" दोनों सही हैं:
-13 % 64 = -13 (on modulus 64)
-13 % 64 = 51 (on modulus 64)
विकल्पों में से एक को जावा भाषा डेवलपर्स द्वारा चुना जाना था और उन्होंने चुना:
परिणाम का संकेत लाभांश के संकेत के बराबर होता है।
इसे जावा स्पेक्स में कहते हैं:
https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.17.3
-13 % 64 = 51
जब मैं उम्मीद कर रहा था तो जावा मुझे क्यों देता है -13
?"।
int result = (-5) % 3;
-2 देता है। int result = (-3) % 5;
-3 देता है। सामान्य तौर पर, int result = (-a) % b;
सही उत्तर देता है जब | -ए | > बी। जब उचित परिणाम प्राप्त करने के लिए | <b हमें विभाजक को लपेटना चाहिए। int result = ((-a) % b) + b;
नकारात्मक के लिए एक या int result = (((-a) % b) + b) % b;
सकारात्मक या नकारात्मक के लिए एक
आपका परिणाम जावा के लिए गलत है। कृपया कुछ संदर्भ प्रदान करें कि आप इस पर कैसे पहुंचे (आपका कार्यक्रम, कार्यान्वयन और जावा का संस्करण)।
15.17.3 रेमिनेटर ऑपरेटर%
[...]
बाइनरी न्यूमेरिक प्रमोशन (produces5.6.2) के बाद पूर्णांक वाले ऑपरेंड के लिए शेष संचालन परिणाम मान उत्पन्न करता है जैसे (a / b) * b + (a% b) बराबर होता है ए।
15.17.2 डिवीजन ऑपरेटर /
[...]
पूर्णांक विभाजन 0 की ओर गोल होता है।
चूँकि / शून्य की ओर गोल है (शून्य में जिसके परिणामस्वरूप), इस मामले में% का परिणाम नकारात्मक होना चाहिए।
int result = (-5) % 3;
-2 int result = (-3) % 5;
देता है -3 सामान्य रूप से, int result = (-a) % b;
सही उत्तर देता है जब -a | > b उचित परिणाम प्राप्त करने के लिए जब -a | <b हमें विभाजक को लपेटना चाहिए। int result = ((-a) % b) + b;
नकारात्मक के लिए या int result = (((-a) % b) + b) % b;
सकारात्मक या नकारात्मक के लिए एक।
(-3) % 5
के लिए परिभाषा के अनुसार सही परिणाम है -3
, और जावा का एक सही कार्यान्वयन उस परिणाम का उत्पादन करना चाहिए।
(-3)%5
वास्तव में देता है -3
, और यदि हम चाहते हैं कि सकारात्मक शेष हम इसमें 5 जोड़ दें, और फिर परिणाम होगा2
आप उपयोग कर सकते हैं
(x % n) - (x < 0 ? n : 0);
((x % k) + k) % k
:। (हालांकि आपका शायद अधिक पठनीय है।)
[0, sign(divisor) * divisor)
इसके बजाय की सीमा में मापांक परिणाम के लिए उपयोगी है [0, sign(dividend) * divisor)
।
आपका उत्तर विकिपीडिया में है: मोडुलो ऑपरेशन
यह कहता है, कि Java में modulo Operation पर साइन डिविडेंड की तरह ही होता है। और जब से हम बाकी डिवीजन ऑपरेशन के बारे में बात कर रहे हैं, यह ठीक है, कि यह आपके मामले में -13 लौटा देता है, -13/64 = 0. -13-0 = -13 के बाद से।
संपादित करें: क्षमा करें, आपके प्रश्न को गलत समझा ... आप सही हैं, जावा को -13 देना चाहिए। क्या आप अधिक आस-पास कोड प्रदान कर सकते हैं?
नकारात्मक ऑपरेंड के साथ मोडुलो अंकगणित भाषा डिजाइनर द्वारा परिभाषित किया गया है, जो इसे भाषा के कार्यान्वयन के लिए छोड़ सकता है, जो सीपीयू वास्तुकला की परिभाषा को स्थगित कर सकता है।
मैं जावा भाषा की परिभाषा नहीं खोज पाया।
थैंक्स ईशर, जावा भाषा विनिर्देशन के लिए रेमिनेटर ऑपरेटर% का कहना है कि परिणाम का संकेत अंश के संकेत के समान है।
x = x + m = x - m
मापांक में m
।
इसलिए -13 = -13 + 64
मापांक में 64
और -13 = 51
मापांक में 64
।
मान लें Z = X * d + r
, यदि 0 < r < X
तब विभाजन में Z/X
हम r
शेष को कहते हैं ।
Z % X
शेष बचता है Z/X
।
मॉड फ़ंक्शन को उस राशि के रूप में परिभाषित किया जाता है जिसके द्वारा एक संख्या विभाजक के सबसे बड़े पूर्णांक से अधिक होती है जो उस संख्या से अधिक नहीं होती है। तो आपके मामले में
-13 % 64
64 का सबसे बड़ा पूर्णांक एकाधिक -13 से अधिक नहीं है -64 है। अब -64 से -13 घटाते समय यह 51 के बराबर हो जाता है-13 - (-64) = -13 + 64 = 51
जावा के मेरे संस्करण में JDK 1.8.0_05 -13% 64 = -13
आप -13- (int (-13/64)) को दूसरे शब्दों में विभाजित करने के लिए एक पूर्णांक के लिए डिवीजन कास्ट कर सकते हैं ताकि अंश से घटाया जा सके इसलिए अंश - (int (अंश / हर)) सही देना चाहिए शेष और संकेत
जावा नवीनतम संस्करणों में आपको मिलता है -13%64 = -13
। उत्तर में हमेशा अंश का चिह्न होगा।
जेएलएस की धारा 15.17.3 के अनुसार, "बाइनरी न्यूमेरिक प्रमोशन के बाद पूर्णांक वाले ऑपरेशंस के लिए शेष संचालन एक परिणाम मान उत्पन्न करता है जैसे (ए / बी) * बी + (एक% बी) एक के बराबर है। यह पहचान भी रखती है। विशेष मामले में कि लाभांश अपने प्रकार के लिए सबसे बड़ा संभव परिमाण का ऋणात्मक पूर्णांक है और भाजक -1 है (शेष 0 है)। "
उम्मीद है की वो मदद करदे।
मुझे नहीं लगता कि जावा इस मामले में 51 रिटर्न करता है। मैं एक मैक पर जावा 8 चला रहा हूं और मुझे मिल रहा है:
-13 % 64 = -13
कार्यक्रम:
public class Test {
public static void main(String[] args) {
int i = -13;
int j = 64;
System.out.println(i % j);
}
}