আমি কি মডুলাস ভুল করছি? কারণ জাভাতে -13 % 64
মূল্যায়ন করার কথা -13
কিন্তু আমি পেয়েছি 51
।
%
একটি অবশিষ্ট অপারেটর।
আমি কি মডুলাস ভুল করছি? কারণ জাভাতে -13 % 64
মূল্যায়ন করার কথা -13
কিন্তু আমি পেয়েছি 51
।
%
একটি অবশিষ্ট অপারেটর।
উত্তর:
Negativeণাত্মক সংখ্যার মডুলাসের উভয় সংজ্ঞা ব্যবহৃত হয় - কিছু ভাষায় একটি সংজ্ঞা ব্যবহার করা হয় এবং কিছু অন্যটি।
আপনি যদি নেতিবাচক ইনপুটগুলির জন্য একটি নেতিবাচক নম্বর পেতে চান তবে আপনি এটি ব্যবহার করতে পারেন:
int r = x % n;
if (r > 0 && x < 0)
{
r -= n;
}
তেমনিভাবে যদি আপনি এমন কোনও ভাষা ব্যবহার করেন যা একটি নেতিবাচক ইনপুটটিতে নেতিবাচক সংখ্যা ফেরায় এবং আপনি ইতিবাচক পছন্দ করবেন:
int r = x % n;
if (r < 0)
{
r += n;
}
x % y
, ক) যদি x
নেতিবাচক হয় তবে বাকীটি negativeণাত্মক হয়, অর্থাত্ 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;
| | -এ | যখন সঠিক উত্তর দেয় > খ। যথাযথ ফলাফল পাওয়ার জন্য | | -এ | <বি আমাদের বিভাজক মোড়ানো উচিত। int result = ((-a) % b) + b;
নেতিবাচক জন্য বা int result = (((-a) % b) + b) % b;
ইতিবাচক বা নেতিবাচক একটি
আপনার ফলাফল জাভা জন্য ভুল। আপনি কীভাবে এটি পৌঁছেছেন দয়া করে কিছু প্রসঙ্গ সরবরাহ করুন (আপনার প্রোগ্রাম, জাভাটির বাস্তবায়ন এবং সংস্করণ)।
থেকে জাভা ল্যাঙ্গুয়েজ স্পেসিফিকেশন
15.17.3 অপারেটর%
[...]
অপারেটরগুলির বাকী অপারেশনগুলি বাইনারি সংখ্যার প্রচারের পরে (.65.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;
সঠিক উত্তর দেয় যখন | -এ | > খ যথাযথ ফলাফল পেতে যখন | -এ | <বি আমাদের বিভাজক মোড়ানো উচিত। 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)
।
আপনার উত্তরটি উইকিপিডিয়ায় রয়েছে: মডুলো অপারেশন
এটি বলে যে, জাভাতে মডুলো অপারেশনে সাইনটি লভ্যাংশের সমান। এবং যেহেতু আমরা বাকী বিভাগের অপারেশন সম্পর্কে কথা বলছি ঠিক আছে, এটি -13/64 = 0. -13-0 = -13 থেকে আপনার ক্ষেত্রে -13 প্রদান করে।
সম্পাদনা: দুঃখিত, আপনার প্রশ্নকে ভুল বোঝে ... আপনি ঠিক বলেছেন, জাভা দেওয়া উচিত -13। আপনি কি আরও পার্শ্ববর্তী কোড সরবরাহ করতে পারেন?
নেতিবাচক অপারেশনগুলির সাথে মডুলো গাণিতিকটি ভাষা ডিজাইনার দ্বারা সংজ্ঞায়িত করা হয়, যিনি এটিকে ভাষা প্রয়োগে রেখে যেতে পারেন, যিনি সিপিইউ আর্কিটেকচারের সংজ্ঞা স্থির করতে পারেন।
আমি জাভা ভাষার সংজ্ঞা পাইনি।
ধন্যবাদ ইশতার, রেমেন্ডার অপারেটর% এর জন্য জাভা ল্যাঙ্গুয়েজ স্পেসিফিকেশন বলে যে ফলাফলের সাইনটি সংখ্যার চিহ্ন হিসাবে একই।
এটি কাটিয়ে উঠতে আপনি 64
ইতিবাচক হওয়া অবধি নেতিবাচক মানটিতে (বা আপনার মডিউলাস বেসটি যাই হোক না কেন) যুক্ত করতে পারেন
int k = -13;
int modbase = 64;
while (k < 0) {
k += modbase;
}
int result = k % modbase;
ফলাফলটি একই সমতুল্য শ্রেণিতে থাকবে।
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। এখন, যখন আপনি -13 থেকে -13 বিয়োগ করেন এটি 51 এর সমান-13 - (-64) = -13 + 64 = 51
জাভা জেডিকে আমার সংস্করণে 1.8.0_05 -13% 64 = -13
আপনি -13- (int (-13/64)) অন্য কথায় চেষ্টা করতে পারলেন ভগ্নাংশের অংশ থেকে মুক্তি পেতে বিভাগকে একটি পূর্ণসংখ্যায় ফেলতে হবে তারপরে অঙ্ক থেকে বিয়োগ করুন সুতরাং সংখ্যক- (int (সংখ্যক / ডিনোমিনেটর) সঠিকভাবে দেওয়া উচিত বাকি এবং সাইন
জাভা সর্বশেষ সংস্করণে আপনি পাবেন -13%64 = -13
। উত্তরে সর্বদা সংখ্যার চিহ্ন থাকবে।
জেএলএসের 15.17.3 ধারা অনুসারে, "বাইনারি সংখ্যার প্রচারের পরে পূর্ণসংখ্যক অপারেটরগুলির জন্য অবশিষ্ট অপারেশন ফলাফলের মান তৈরি করে যেমন (a / b) * b + (a% b) এর সমান। এই পরিচয়টি ধরে রাখে এমনকি বিশেষ ক্ষেত্রে যে লভ্যাংশটি তার ধরণের জন্য সম্ভাব্য বৃহত্তম মাত্রার নেতিবাচক পূর্ণসংখ্যা এবং বিভাজক -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);
}
}