জাভা কীভাবে নেতিবাচক সংখ্যার সাথে মডুলাস গণনা করে?


96

আমি কি মডুলাস ভুল করছি? কারণ জাভাতে -13 % 64মূল্যায়ন করার কথা -13কিন্তু আমি পেয়েছি 51


102
@ ড্যান এমনকি স্থির মূল শূন্যতা ছাড়াই ... আমি কোডটি দেখছি।
জোরিস মাইস

22
আমি -13 এবং 64 == -13
গ্রোড্রিগেজ

7
এটি কীভাবে আপনি -13 এর তুলনায় 51 হার হার পাচ্ছেন?
রায়েডওয়াল্ড

4
আপনি মোটেও মডুলাস করছেন না। জাভাতে কোনও মডুলো অপারেটর নেই। %একটি অবশিষ্ট অপারেটর।
লার্নের মারকুইস

4
বিভ্রান্তকর প্রশ্ন: জাভা 8 -13 দেয়, যেমন অন্য কিছু লোক বলেছেন। আপনি কোন জাভা সংস্করণটি অনুমিতভাবে এটি পেয়েছেন?
জানু কনভস্কি

উত্তর:


105

Negativeণাত্মক সংখ্যার মডুলাসের উভয় সংজ্ঞা ব্যবহৃত হয় - কিছু ভাষায় একটি সংজ্ঞা ব্যবহার করা হয় এবং কিছু অন্যটি।

আপনি যদি নেতিবাচক ইনপুটগুলির জন্য একটি নেতিবাচক নম্বর পেতে চান তবে আপনি এটি ব্যবহার করতে পারেন:

int r = x % n;
if (r > 0 && x < 0)
{
    r -= n;
}

তেমনিভাবে যদি আপনি এমন কোনও ভাষা ব্যবহার করেন যা একটি নেতিবাচক ইনপুটটিতে নেতিবাচক সংখ্যা ফেরায় এবং আপনি ইতিবাচক পছন্দ করবেন:

int r = x % n;
if (r < 0)
{
    r += n;
}

4
এন নেগেটিভ হলে এটি ভাল কাজ করে না। আপনি যদি জাভা 7 ল্যাং স্পেক (বিভাগ 15.17.3) থেকে একই উদাহরণ ব্যবহার করেন: (-5)% (-3) = -2। -3 যোগ করলে কাজ হবে না। আপনার মানটি ইতিবাচক কিনা তা নিশ্চিত হতে চাইলে আপনার n এর পরম মান যুক্ত করা উচিত।
partlov

6
জাভাতে নেতিবাচক মডুলো কোনও পরিবর্তন করে না, যদি আপনি যাইহোক কোনও Abs () ব্যবহার করেন তবে কেবল r = x% অ্যাবস (এন) লিখুন। বিবৃতি আমার পছন্দ নয়, আমি বরং r = ((x% n) + n)% এন লিখব write 2 টি মডুলোর পাওয়ার সম্পর্কে (2,4,8,16, ইত্যাদি ..) এবং ইতিবাচক উত্তর, বাইনারি মাস্ককে r = x ও 63 বিবেচনা করুন
ফাব্যেন

4
জাভা প্রসঙ্গে (প্রশ্ন ট্যাগ হিসাবে) এই উত্তরটি মূলত "ভুল"। এক্সপ্রেশন দেওয়া হয়েছে x % y, ক) যদি xনেতিবাচক হয় তবে বাকীটি negativeণাত্মক হয়, অর্থাত্‍ x % y == -(-x % y)। খ) এর yx % y == x % -y
বোহেমিয়ান

72

যেহেতু "গাণিতিকভাবে" উভয়ই সঠিক:

-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


8
প্রশ্নটি হল " -13 % 64 = 51যখন আমি প্রত্যাশা করছিলাম তখন জাভা আমাকে দেয় কেন -13?"
পাস্কেল কুয়াক

4
@ পাসল: জাভা আপনাকে গণিতের সঠিক সংজ্ঞা দেয় এবং এটি করার জন্য যেভাবে এটি প্রয়োগ করা হয়েছে তা আপনি এটি থেকে প্রত্যাশিত জিনিসটি করেন না।

9
গাণিতিকভাবে বুদ্ধিমান আচরণ জাভা 8 এ পাওয়া যায়: ম্যাথ.ফ্লোরমড
জেসি গ্লিক

4
তাদের 15.17.3 এ কিছু অপারেটর অপারেটর% উদাহরণগুলি পরিষ্কার নয়। 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;ইতিবাচক বা নেতিবাচক একটি
ওজেড এড্রি

@ কনার আমি এটি বুঝতে পারি নি, উভয়ই কীভাবে এক হতে পারে?
কিশোর কুমার কোরদা

20

আপনি কি জাভাতে কাজ করছেন নিশ্চিত? 'কারণ জাভা প্রত্যাশা অনুযায়ী -13% 64 = -13 দেয়। লভ্যাংশের চিহ্ন!


15

আপনার ফলাফল জাভা জন্য ভুল। আপনি কীভাবে এটি পৌঁছেছেন দয়া করে কিছু প্রসঙ্গ সরবরাহ করুন (আপনার প্রোগ্রাম, জাভাটির বাস্তবায়ন এবং সংস্করণ)।

থেকে জাভা ল্যাঙ্গুয়েজ স্পেসিফিকেশন

15.17.3 অপারেটর%
[...]
অপারেটরগুলির বাকী অপারেশনগুলি বাইনারি সংখ্যার প্রচারের পরে (.65.6.2) ফলাফল ফলাফল তৈরি করে যা (a / b) * b + (a% b) সমান ক।
15.17.2 বিভাগ অপারেটর /
[...]
পূর্ণসংখ্যা বিভাগ 0 এর দিকে ।

যেহেতু / শূন্যের দিকে গোল হয় (শূন্যের ফলে),% এর ফলাফল এক্ষেত্রে নেতিবাচক হওয়া উচিত।


তাদের 15.17.3 এ কিছু অপারেটর অপারেটর% উদাহরণগুলি পরিষ্কার নয়। 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;ইতিবাচক বা নেতিবাচক জন্য।
ওজ এড্রি

4
আপনার মন্তব্যটি বেশ অস্পষ্ট। বিভাগটি সঠিক ফলাফলটি সংজ্ঞায়িত করে এবং উদাহরণগুলি সেই সংজ্ঞাটির সাথে একমত হয়। আপনার উদাহরণের (-3) % 5জন্য সংজ্ঞা অনুযায়ী সঠিক ফলাফল -3এবং জাভাটির একটি সঠিক প্রয়োগের ফলে ফলাফলটি পাওয়া উচিত।
তারকাব্লু

আমার ধারণা আমি নিজেকে সঠিকভাবে ব্যাখ্যা করিনি। | -এ | <বি যখন আমি "সঠিক উত্তর" বলতে চাইছিলাম তা হ'ল এটি একটি ইতিবাচক ফলাফল পাওয়ার জন্য আমাদের দেওয়া ফলাফলটিকে% b থেকে "মোড়ানো" উচিত এটিতে বি যুক্ত করে। আমার উদাহরণস্বরূপ, (-3)%5প্রকৃতপক্ষে দেয় -3, এবং আমরা যদি ইতিবাচক অবশিষ্টাংশ চাই তবে আমাদের এটিতে 5 যোগ করা উচিত, এবং তারপরে ফলাফলটি হবে2
ওজ এড্রি

6

তুমি ব্যবহার করতে পার

(x % n) - (x < 0 ? n : 0);

4
@ruslik এছাড়াও আপনি করতে পারেন: ((x % k) + k) % k। (যদিও আপনার সম্ভবত আরও পাঠযোগ্য।)
জন কুরলাক

4
@ জনকুরলাক আপনার সংস্করণটি এর মতো কাজ করে: 4% 3 = 1 বা 4% -3 = -2 বা -4% 3 = 2 বা -4% -3 = -1 তবে রসিকের একটিটি এর মতো কাজ করে: 4% 3 = 1 বা 4% -3 = 1 বা -4% 3 = -4 বা -4% -3 = 2
জোসচুয়া

4
@ জোছুয়া এটি দেখানোর জন্য ধন্যবাদ। আমার কোডটি যখন আপনি চান যে মডুলাসের ফলাফলের [0, sign(divisor) * divisor)পরিবর্তে এর পরিসীমাতে আসে তখন তার জন্য সহায়ক [0, sign(dividend) * divisor)
জন কুরলাক

3

আপনার উত্তরটি উইকিপিডিয়ায় রয়েছে: মডুলো অপারেশন

এটি বলে যে, জাভাতে মডুলো অপারেশনে সাইনটি লভ্যাংশের সমান। এবং যেহেতু আমরা বাকী বিভাগের অপারেশন সম্পর্কে কথা বলছি ঠিক আছে, এটি -13/64 = 0. -13-0 = -13 থেকে আপনার ক্ষেত্রে -13 প্রদান করে।

সম্পাদনা: দুঃখিত, আপনার প্রশ্নকে ভুল বোঝে ... আপনি ঠিক বলেছেন, জাভা দেওয়া উচিত -13। আপনি কি আরও পার্শ্ববর্তী কোড সরবরাহ করতে পারেন?


2

নেতিবাচক অপারেশনগুলির সাথে মডুলো গাণিতিকটি ভাষা ডিজাইনার দ্বারা সংজ্ঞায়িত করা হয়, যিনি এটিকে ভাষা প্রয়োগে রেখে যেতে পারেন, যিনি সিপিইউ আর্কিটেকচারের সংজ্ঞা স্থির করতে পারেন।

আমি জাভা ভাষার সংজ্ঞা পাইনি।
ধন্যবাদ ইশতার, রেমেন্ডার অপারেটর% এর জন্য জাভা ল্যাঙ্গুয়েজ স্পেসিফিকেশন বলে যে ফলাফলের সাইনটি সংখ্যার চিহ্ন হিসাবে একই।


1

এটি কাটিয়ে উঠতে আপনি 64ইতিবাচক হওয়া অবধি নেতিবাচক মানটিতে (বা আপনার মডিউলাস বেসটি যাই হোক না কেন) যুক্ত করতে পারেন

int k = -13;
int modbase = 64;

while (k < 0) {
    k += modbase;
}

int result = k % modbase;

ফলাফলটি একই সমতুল্য শ্রেণিতে থাকবে।


1

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


1

মোড ফাংশনটি এমন পরিমাণ হিসাবে সংজ্ঞায়িত করা হয় যার দ্বারা কোনও সংখ্যা বিভাজকের সবচেয়ে বড় পূর্ণসংখ্য একাধিকের চেয়ে বেশি হয় না যে সংখ্যার চেয়ে বেশি নয়। আপনার ক্ষেত্রে তাই

-13 % 64

64-এর বৃহত্তম পূর্ণসংখ্যা একাধিক যা -13 এর বেশি নয় -64। এখন, যখন আপনি -13 থেকে -13 বিয়োগ করেন এটি 51 এর সমান-13 - (-64) = -13 + 64 = 51


0

জাভা জেডিকে আমার সংস্করণে 1.8.0_05 -13% 64 = -13

আপনি -13- (int (-13/64)) অন্য কথায় চেষ্টা করতে পারলেন ভগ্নাংশের অংশ থেকে মুক্তি পেতে বিভাগকে একটি পূর্ণসংখ্যায় ফেলতে হবে তারপরে অঙ্ক থেকে বিয়োগ করুন সুতরাং সংখ্যক- (int (সংখ্যক / ডিনোমিনেটর) সঠিকভাবে দেওয়া উচিত বাকি এবং সাইন


0

জাভা সর্বশেষ সংস্করণে আপনি পাবেন -13%64 = -13। উত্তরে সর্বদা সংখ্যার চিহ্ন থাকবে।


কোন সংস্করণে এই পরিবর্তন করা হয়েছিল?
নাইটশেডকুইন

জাভা
In-তে

@ নাইটশেডকুইন এটি কখনও পরিবর্তন করা হয়নি।
লার্নের মারকুইস

0

জেএলএসের 15.17.3 ধারা অনুসারে, "বাইনারি সংখ্যার প্রচারের পরে পূর্ণসংখ্যক অপারেটরগুলির জন্য অবশিষ্ট অপারেশন ফলাফলের মান তৈরি করে যেমন (a / b) * b + (a% b) এর সমান। এই পরিচয়টি ধরে রাখে এমনকি বিশেষ ক্ষেত্রে যে লভ্যাংশটি তার ধরণের জন্য সম্ভাব্য বৃহত্তম মাত্রার নেতিবাচক পূর্ণসংখ্যা এবং বিভাজক -1 হয় (অবশিষ্টটি 0) "

আশা করি এইটি কাজ করবে.


-1

আমি মনে করি না জাভা এই ক্ষেত্রে 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);
    }
}

4
@ জাভারকাপেলার, না! অনেকে গাণিতিকভাবে বলছেন -13 এবং 51 সঠিক বলেছিলেন out জাভাতে, -13 প্রত্যাশিত উত্তর, এবং এটি আমার কাছেও পেয়েছে, সুতরাং আমি জানি না যে কীভাবে সাবমিটার 51 পেয়েছিলেন, এটি রহস্য। প্রসঙ্গে মুডের বিশদটি এই প্রশ্নের সঠিক উত্তর দিতে সহায়তা করতে পারে।
ফাব্যেন

@ জাভার কাপেলার: 51 এবং -13 উভয়ই কীভাবে সঠিক হতে পারে? জাভা কেবল একটি মান ফিরে আসবে ..
ceprateek

@ জাভারক্যাপেলার একটি উত্তর কীভাবে জবাব দিতে পারে যে নথিটি সম্ভবত ভুল হতে পারে?
লার্নের মারকুইস

@ ই জে পি আমার মনে হয় 3 বছর আগে যখন আমি এটি লিখেছিলাম তখন জাভা কীভাবে এর মোকাবিলা করে তার সাধারণ বাস্তবতার চেয়ে গাণিতিক যথার্থতার চেয়ে মূল্যবান হিসাবে আমি যথেষ্ট ছিলাম। আমার বোকা মন্তব্য মুছে ফেলার জন্য আমাকে স্মরণ করিয়ে দেওয়ার জন্য ধন্যবাদ: ডি
জাভার ক্যাপেলার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.