নেতিবাচক সংখ্যা সহ মডুলো অপারেশন


191

একটি সি প্রোগ্রামে আমি নীচের ক্রিয়াকলাপগুলি চেষ্টা করছিলাম (কেবল আচরণটি পরীক্ষা করার জন্য)

 x = 5 % (-3);
 y = (-5) % (3);
 z = (-5) % (-3); 

printf("%d ,%d ,%d", x, y, z); 

আমাকে সিসিপি হিসাবে আউটপুট দিয়েছে (2, -2 , -2)। আমি প্রতিবারই একটি ইতিবাচক ফলাফল আশা করছিলাম। একটি মডুলাস নেতিবাচক হতে পারে? কেউ কি এই আচরণ ব্যাখ্যা করতে পারেন?



উত্তর:


167

C99 এর জন্য প্রয়োজন যখন যখন a/bপ্রতিনিধিত্বযোগ্য:

(a/b) * b + + a%b সমান হইবেa

এটি যৌক্তিকভাবে বোঝায়। রাইট?

আসুন দেখি এর ফলে কী ঘটে:


উদাহরণ উ: 5/(-3)হয়-1

=> (-1) * (-3) + 5%(-3) =5

এটি কেবল 5%(-3)2 হলেই ঘটতে পারে ।


উদাহরণ বি (-5)/3হল-1

=> (-1) * 3 + (-5)%3 =-5

এটি কেবলমাত্র যদি ঘটতে পারে (-5)%3হয়-2


1
সংকলকটি কি যথেষ্ট স্মার্ট হওয়া উচিত এবং স্বাক্ষরযুক্ত কোনও মডিউলটি অন্য স্বাক্ষরবিহীন মডিউলটি সর্বদা ইতিবাচক কিনা তা সনাক্ত করতে পারে? বর্তমানে (ভাল, জিসিসি 5.2) সংকলকটি মনে করে যে "%" এই ক্ষেত্রে "স্বাক্ষরবিহীন" না হয়ে উভয় অপারেটর uint32_t বা বৃহত্তর হলেও "ইনট" প্রদান করবে।
ফ্রেডরিক নর্ড

@ ফ্রেডেরিকনর্ডের সেই আচরণটি দেখানোর কোনও উদাহরণ আছে কি?
chux - মনিকা পুনরায় স্থাপন করুন

10
বুঝতে পারছেন যে আপনি যা বর্ণনা করেন তা হ'ল মোডের সাধারণ অন্তর্নিহিত (a / b) (কাটা কাটা) বিবরণ। তবে এটিও সম্ভব যে নিয়মটি মেঝে (a / b) (নুথ)। নথ ক্ষেত্রে -5/3হয় -2এবং মোড 1 হয়ে যায়: সংক্ষেপে: একটি মডিউলে একটি চিহ্ন রয়েছে যা ডিভিডেন্ড সাইন (ট্র্যাঙ্কেট) অনুসরণ করে, অন্য মডিউলে একটি চিহ্ন রয়েছে যা বিভাজন চিহ্ন (নুথ) অনুসরণ করে।
আইজাক

1
এটি সি স্ট্যান্ডার্ডের একটি ক্ষেত্রে যা আমি চাই ঠিক তেমন হয় না। আমি কখনও শূন্য বা নেতিবাচক মডুলো সংখ্যায় কাটতে চাইনি, তবে প্রায়শই বিপরীতটি চাই এবং সি এর আশেপাশে কাজ করা দরকার
জো

142

%সি অপারেটর নয় মডিউল অপারেটর কিন্তু বাকি অপারেটর।

মডুলো এবং বাকী অপারেটরগুলি নেতিবাচক মানগুলির ক্ষেত্রে আলাদা।

বাকি অপারেটরের সাথে, ফলাফলের সাইনটি লভ্যাংশের চিহ্ন হিসাবে একই হয় এবং একটি মডুলো অপারেটরের সাথে ফলাফলের চিহ্নটি বিভাজকের সমান হয়।

সি সংজ্ঞা দেয় % জন্য অপারেশনটিa % b :

  a == (a / b * b) + a % b

সঙ্গে /প্রতি ছাঁটাই সঙ্গে পূর্ণসংখ্যা বিভাজন 0। এটি হ'ল সংক্ষিপ্তকরণটি 0(এবং নেতিবাচক অনির্বাণের দিকে নয়) প্রতি সম্পন্ন হয় যা %একটি মডুলো অপারেটরের পরিবর্তে অবশিষ্ট অপারেটর হিসাবে সংজ্ঞায়িত করে ।


8
অনুস্মারক সংজ্ঞা অনুসারে মডুলো অপারেশনের ফলাফল । বাকি অপারেটরের মতো কোনও জিনিস থাকা উচিত নয় কারণ বাকী অপারেশন বলে কোনও জিনিস নেই, একে মডুলো বলা হয়।
gronostaj

41
@ গ্রনোস্টাজ সিএস-এ নেই। হাস্কেল বা স্কিমের মতো উচ্চ স্তরের ভাষাগুলি দেখুন যা উভয়ই দুটি পৃথক অপারেটরকে ( remainderএবং moduloস্কিমে remএবং modহাস্কেলের মধ্যে) সংজ্ঞা দেয়। এই অপারেটরগুলির স্পেসিফিকেশনগুলি কীভাবে বিভাগটি করা হয় সে সম্পর্কে এই ভাষাগুলির মধ্যে পৃথক: 0 বা দিকে নেতিবাচক অনন্তের দিকে কাটা যেভাবে সি স্ট্যান্ডার্ড কখনও কখনও মডুলো অপারেটরকে কল করে %না , তারা কেবল এটি % অপারেটরের নাম দেয় ।
ওহাহ

2
সিতে remainder ফাংশন নিয়ে বিভ্রান্ত হওয়ার দরকার নেই , যা বিভাগের রাউন্ড-ওয়েস্ট-নিকটস্থ শব্দার্থবিজ্ঞানের সাথে আইইইই বাকিটি প্রয়োগ করে
এরিক

67

C99 নির্দিষ্টকরণের ভিত্তিতে: a == (a / b) * b + a % b

আমরা গণনা করতে একটি ফাংশন লিখতে পারি (a % b) == a - (a / b) * b!

int remainder(int a, int b)
{
    return a - (a / b) * b;
}

মডুলো অপারেশনের জন্য, আমাদের নিম্নলিখিত ফাংশন থাকতে পারে (ধরে নিচ্ছি b > 0)

int mod(int a, int b)
{
    int r = a % b;
    return r < 0 ? r + b : r;
}

আমার উপসংহারটি হ'ল a % bসিতে একটি অবশিষ্ট অপারেশন এবং কোনও মডুলো অপারেশন নয়।


3
bনেতিবাচক হলে এটি ইতিবাচক ফলাফল দেয় না (এবং বাস্তবে rএবং bউভয় নেতিবাচক এটি এর চেয়ে কম ফলাফল দেয় -b)। আপনি যে ইনপুটগুলি ব্যবহার করতে পারেন তার জন্য ইতিবাচক ফলাফলগুলি নিশ্চিত করতে r + abs(b)বা bএর চিহ্নের সাথে মেলে আপনি পরিবর্তনের r*b < 0পরিবর্তে শর্তটি পরিবর্তন করতে পারেন ।
মার্টিন ইন্ডার

@ মার্টিনএন্ডার r + abs(b)যখন ইউবি হয় তখন b == INT_MIN
chux - মনিকা পুনরায় ইনস্টল করুন

60

আমি মনে করি না সংখ্যাটি নেতিবাচক কিনা তা খতিয়ে দেখার দরকার নেই।

ইতিবাচক মডুলোগুলি সন্ধান করার জন্য একটি সাধারণ কাজ এটি হবে -

সম্পাদনা: ধরে নেওয়া N > 0এবংN + N - 1 <= INT_MAX

int modulo(int x,int N){
    return (x % N + N) %N;
}

এটি এক্স এর ধনাত্মক এবং নেতিবাচক উভয় মানের জন্য কাজ করবে ।

মূল দ্রষ্টব্য: এছাড়াও @chux দ্বারা সরু আউট, আপনার x এবং এন INT_MAX করেছেন -1 এবং INT_MAX ভালো কিছু যথাক্রমে পৌছাতে পারেন, শুধু প্রতিস্থাপন তাহলে intসঙ্গে long long int

এবং যদি তারা দীর্ঘ দীর্ঘ সীমাও অতিক্রম করে থাকে (যেমন LLONG_MAX এর নিকটবর্তী), তবে আপনি এখানে অন্যান্য উত্তরে বর্ণিত হিসাবে আলাদাভাবে ইতিবাচক এবং নেতিবাচক কেসগুলি পরিচালনা করবেন।


1
নোট করুন যে যখন N < 0, ফলাফল হিসাবে হিসাবে নেতিবাচক হতে পারে modulo(7, -3) --> -2। এছাড়াও x % N + Nওভারফ্লো করতে intগণিত যা আচরণ undefined করা হয়। উদাহরণস্বরূপ modulo(INT_MAX - 1,INT_MAX)-3 হতে পারে।
chux - মনিকা পুনরায় ইনস্টল করুন

হ্যাঁ, সেক্ষেত্রে আপনি কেবল long long intনেতিবাচক কেসকে আলাদাভাবে ব্যবহার করতে পারবেন বা পরিচালনা করতে পারবেন (সরলতা হ্রাস করার বিনিময়ে)।
উদয়রাজ দেশমুখ

9

অন্যান্য উত্তরগুলি C99 বা তার পরে ব্যাখ্যা করেছে , নেতিবাচক অপারেশনগুলির সাথে জড়িত পূর্ণসংখ্যার বিভাজন সবসময় শূন্যের দিকে বিচ্ছিন্ন হয়

দ্রষ্টব্য, C89 এ , ফলাফলটি বৃত্তাকার দিকে বা নিম্নমুখী বাস্তবায়ন-সংজ্ঞায়িত কিনা। যেহেতু সমস্ত স্ট্যান্ডার্ডের (a/b) * b + a%bসমান a, %নেতিবাচক অপারেশনগুলিকে জড়িত করার ফলাফলটিও সি 98 এ বাস্তবায়ন-সংজ্ঞায়িত।


5

একটি মডুলাস নেতিবাচক হতে পারে?

%operator ণাত্মক হতে পারে কারণ এটি অবশিষ্ট অপারেটর , বিভাগের পরের অংশ, ইউক্লিডিয়ান_বিভাজনের পরে নয় । সি 99 এর পরে ফলাফল 0, নেতিবাচক বা ধনাত্মক হতে পারে।

 // a % b
 7 %  3 -->  1  
 7 % -3 -->  1  
-7 %  3 --> -1  
-7 % -3 --> -1  

মডিউল ওপি চেয়েছিলেন একটি ক্লাসিক ইউক্লিডিয় মডিউল না %

আমি প্রতিবারই একটি ইতিবাচক ফলাফল আশা করছিলাম।

একটি ইউক্লিডিয় মডিউল যে ভাল সংজ্ঞায়িত করা হয় যখনই কর্ম সঞ্চালন করার জন্য a/bসংজ্ঞায়িত করা হয়, a,bকোন চিহ্নের এবং ফলাফলের নেতিবাচক হয় না:

int modulo_Euclidean(int a, int b) {
  int m = a % b;
  if (m < 0) {
    // m += (b < 0) ? -b : b; // avoid this form: it is UB when b == INT_MIN
    m = (b < 0) ? m - b : m + b;
  }
  return m;
}

modulo_Euclidean( 7,  3) -->  1  
modulo_Euclidean( 7, -3) -->  1  
modulo_Euclidean(-7,  3) -->  2  
modulo_Euclidean(-7, -3) -->  2   

2

মডুলো অপারেশনের ফলাফলটি সংখ্যার চিহ্নের উপর নির্ভর করে এবং এভাবে আপনি y এবং z এর জন্য -2 পাচ্ছেন

রেফারেন্স এখানে

http://www.chemie.fu-berlin.de/chemnet/use/info/libc/libc_14.html

পূর্ণসংখ্যা বিভাগ

এই বিভাগটি পূর্ণসংখ্যা বিভাগ সম্পাদনের জন্য ফাংশনগুলি বর্ণনা করে। এই ফাংশনগুলি GNU সি লাইব্রেরিতে অপ্রয়োজনীয়, যেহেতু GNU C তে '/' অপারেটর সর্বদা শূন্যের দিকে থাকে s তবে অন্যান্য সি বাস্তবায়নে, '/' নেতিবাচক যুক্তিগুলির সাথে আলাদা হতে পারে। ডিভ এবং এলডিভ দরকারী কারণ তারা ভাগফলকে কীভাবে গোল করবেন: শূন্যের দিকে। বাকী অংশটিতে অঙ্কের সমান চিহ্ন রয়েছে।


5
আপনি এএনএসআই সি সম্পর্কে একটি পাঠ্যকে উল্লেখ করছেন এটি সি এর মোটামুটি পুরানো আদর্শ, এএনএসআই সি সম্পর্কিত পাঠ্য সঠিক কিনা তা নিশ্চিত নন, তবে অবশ্যই C99 সম্পর্কিত নয়। C99 §6.5.5 এ পূর্ণসংখ্যা বিভাগ সর্বদা শূন্যের দিকে কাটাতে সংজ্ঞায়িত হয়।
প্যালেক

2

গণিতে, যেখানে এই সম্মেলনগুলি সূচিত হয়েছে, সেখানে কোনও দাবি নেই যে মডুলো পাটিগণিতের একটি ইতিবাচক ফল পাওয়া উচিত।

যেমন।

1 মোড 5 = 1, তবে এটি -4 এর সমানও হতে পারে। অর্থাত, 1/5 5 থেকে 0 বা -4 থেকে অবশিষ্ট 1 উপার্জন করে (5 এর উভয় কারণ)

একইভাবে, -1 মোড 5 = -1, তবে এটি 4 এর সমানও হতে পারে That অর্থাৎ, -1/5 থেকে 0 -4 থেকে 4 বা -5 থেকে একটি অবশিষ্ট -1 পাওয়া যায়। (উভয় কারণ 5)

আরও পড়ার জন্য গণিতে সমমানের ক্লাসে সন্ধান করুন ।


ইক্যুভ্যালেন্স ক্লাসটি একটি ভিন্ন ধারণা এবং মডুলো খুব কঠোর উপায়ে সংজ্ঞায়িত হয়। ধরুন আমরা দুটি পূর্ণসংখ্যা সংখ্যার আছে যাক aএবং b, b <> 0। ইউক্যালিডিয়ান বিভাগের উপপাদ্য অনুসারে সেখানে এক জোড়া পূর্ণসংখ্যার উপস্থিতি রয়েছে m, rকোথায় a = m * b + rএবং 0 <= r < abs( b )। বললেন r(গাণিতিক) মডিউল অপারেশন ফলাফল এবং দ্বারা সংজ্ঞা অ নেতিবাচক। আরও পড়া এবং উইকিপিডিয়ায় আরও লিঙ্ক: en.wikedia.org/wiki/Euclidean_division
আইস্টার

এটা সত্য নয়। 1 mod 5সর্বদা 1। -4 mod 5খুব 1 হতে পারে তবে তারা বিভিন্ন জিনিস।
ফেলিপিসি

2

সি 99 স্ট্যান্ডার্ড অনুসারে বিভাগ 6.5.5 বহু গুণক অপারেটরগুলি নীচে প্রয়োজনীয়:

(a / b) * b + a % b = a

উপসংহার

C99 অনুসারে বাকী অপারেশনের ফলাফলের চিহ্নটি লভ্যাংশের মতোই।

আসুন কয়েকটি উদাহরণ দেখুন ( dividend / divisor):

যখন কেবল লভ্যাংশ নেতিবাচক হয়

(-3 / 2) * 2  +  -3 % 2 = -3

(-3 / 2) * 2 = -2

(-3 % 2) must be -1

যখন কেবলমাত্র বিভাজন নেতিবাচক হয়

(3 / -2) * -2  +  3 % -2 = 3

(3 / -2) * -2 = 2

(3 % -2) must be 1

যখন বিভাজক এবং লভ্যাংশ উভয়ই নেতিবাচক হয়

(-3 / -2) * -2  +  -3 % -2 = -3

(-3 / -2) * -2 = -2

(-3 % -2) must be -1

.5.৫.৫ গুণক অপারেটর

বাক্য গঠন

  1. গুণনশীল প্রকাশ:
    • cast-expression
    • multiplicative-expression * cast-expression
    • multiplicative-expression / cast-expression
    • multiplicative-expression % cast-expression

সীমাবদ্ধতাসমূহ

  1. প্রতিটি অপারেন্ডের গাণিতিক টাইপ থাকবে। % অপারেটরের অপারেঞ্জগুলির পূর্ণসংখ্যার প্রকার থাকবে।

শব্দার্থবিদ্যা

  1. সাধারণ গাণিতিক রূপান্তরগুলি অপারেন্ডগুলিতে সঞ্চালিত হয়।

  2. বাইনারি * অপারেটরের ফলাফল অপারেন্ডগুলির পণ্য।

  3. / অপারেটরের ফলাফলটি দ্বিতীয় দ্বারা প্রথম অপারেন্ডের বিভাগ থেকে ভাগফল হয়; % অপারেটরের ফলাফল বাকী। উভয় ক্রিয়াকলাপে, দ্বিতীয় অপারেন্ডের মান শূন্য হলে, আচরণটি সংজ্ঞায়িত।

  4. যখন পূর্ণসংখ্যাগুলি বিভক্ত হয়, / অপারেটরের ফলাফল হ'ল বীজগণিত ভাগফল যে কোনও ভগ্নাংশের সাথে বাদ দেওয়া হয় [1]। ভাগফল a/bযদি উপস্থাপনযোগ্য হয় তবে এক্সপ্রেশন (a/b)*b + a%bসমান হবে a

[1]: এটিকে প্রায়শই "শূন্যের দিকে কাটা" বলা হয়।


1

মডুলাস অপারেটর বাকীটি দেয়। গ মধ্যে মডুলাস অপারেটর সাধারণত সংখ্যার সাইন নেয়

  1. x = 5% (-3) - এখানে অঙ্কটি ইতিবাচক কারণ এটি 2 এর ফলাফল
  2. y = (-5)% (3) - এখানে অঙ্কটি নেতিবাচক তাই এর ফলাফল -2 হয়
  3. z = (-5)% (-3) - এখানে অঙ্কটি নেতিবাচক তাই এর ফলাফল -2 হয়

এছাড়াও মডুলাস (বাকী) অপারেটরটি কেবলমাত্র পূর্ণসংখ্যার টাইপের সাথে ব্যবহার করা যায় এবং ভাসমান পয়েন্টের সাথে ব্যবহার করা যায় না।


1
বাহ্যিক সংস্থার লিঙ্কগুলির সাহায্যে আপনি এটি ব্যাক আপ করতে পারলে ভাল লাগবে।
জে ... এস

1

আমি বিশ্বাস করি এটি modবিমূর্ত পাটিগণিত হিসাবে সংজ্ঞায়িত হিসাবে এটি ভাবতে আরও দরকারী ; অপারেশন হিসাবে নয়, পাটিগণিতের সম্পূর্ণ আলাদা শ্রেণি হিসাবে, বিভিন্ন উপাদান এবং বিভিন্ন অপারেটর সহ এর অর্থ সংযোজনটি mod 3"সাধারণ" সংযোজনের মতো নয়; এটাই; পূর্ণসংখ্যা যোগ।

সুতরাং আপনি যখন করবেন:

5 % -3

আপনি সংখ্যার সেটটিতে 5 টি সংখ্যার মানক তৈরি করার চেষ্টা করছেন mod -3। এগুলির উপাদানগুলি mod -3:

{ 0, -2, -1 }

তাই:

0 => 0, 1 => -2, 2 => -1, 3 => 0, 4 => -2, 5 => -1

বলুন যে কোনও কারণে 30 ঘন্টা আপনাকে থাকতে হবে, আপনি সেই দিনটির কত ঘন্টা রেখে যাবেন? 30 mod -24

তবে সি প্রয়োগকারীগুলি কী নয় mod, এটি একটি অবশিষ্ট অংশ। যাইহোক, মুল বক্তব্যটি হ'ল এটি নেতিবাচক প্রত্যাবর্তনে অর্থবোধ করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.