প্রোগ্রামিং ল্যাঙ্গুয়েজ ডিজাইনাররা যখন মডুলো অপারেশনের ফলাফলের জন্য কোন চিহ্নটি নেয় তা সিদ্ধান্ত নেওয়ার সময় কোন যুক্তি ব্যবহার করা হয়?


9

মধ্য দিয়ে যাচ্ছে মডিউলো অপারেশন (এভিনিউ যখন মধ্যে পার্থক্য অন্বেষণ আমি প্রবেশ remএবংmod ) আমি জুড়ে এসেছিল:

গণিতে মডুলো অপারেশনের ফলাফল ইউক্যালিডিয়ান বিভাগের বাকী অংশ। তবে অন্যান্য সম্মেলনগুলিও সম্ভব। কম্পিউটার এবং ক্যালকুলেটরগুলির সংখ্যা সংরক্ষণ এবং প্রতিনিধিত্ব করার বিভিন্ন উপায় রয়েছে; সুতরাং তাদের মডুলো অপারেশন সংজ্ঞা প্রোগ্রামিং ভাষা এবং / বা অন্তর্নিহিত হার্ডওয়্যার উপর নির্ভর করে।

প্রশ্নাবলী:

  • ইউক্লিডিয়ান বিভাগের মধ্য দিয়ে গিয়ে আমি দেখতে পেলাম যে এই অপারেশনের অবশিষ্টাংশ সর্বদা ইতিবাচক (বা 0) থাকে। অন্তর্নিহিত কম্পিউটার হার্ডওয়্যারের কোন সীমাবদ্ধতা প্রোগ্রামিং ভাষা ডিজাইনারকে গণিত থেকে পৃথক করতে বাধ্য করে?
  • প্রতিটি প্রোগ্রামিং ল্যাঙ্গুয়েজের এটি পূর্বনির্ধারিত, বা অপরিজ্ঞাত, এমন নিয়ম রয়েছে যা মডিউল অপারেশনের ফলাফলের স্বাক্ষর পেয়ে থাকে। এই নিয়মগুলি তৈরি করার সময় কোন যুক্তি গৃহীত হয়? এবং যদি অন্তর্নিহিত হার্ডওয়্যারটি উদ্বেগজনক হয় তবে প্রোগ্রামিং ভাষার থেকে পৃথক হয়ে কি সেই অনুযায়ী নিয়মগুলি পরিবর্তন করা উচিত নয়?

1
আমার কোডে আমার প্রায়শই সবসময় মডুলোর দরকার হয় না বাকিগুলি। বাকিরা কেন এত জনপ্রিয় তা জানেন না।
কোডসইনচওস

8
সম্পর্কিত কি পার্থক্য? রিমাইন্ডার বনাম মডুলাস - এরিক লিপার্টের ব্লগ (সি # ডিজাইনারদের একজন, তবে আমি বিশ্বাস করি যে এই সিদ্ধান্ত নেওয়ার পরে তিনি দলে যোগ দিয়েছিলেন)
কোডসইনচওস

1
আপনি যদি উইকিপিডিয়া নিবন্ধটি পড়া চালিয়ে যান (আপনি যে অংশটি উদ্ধৃত করেছেন তার বাইরে), এটি আপনাকে সুন্দরভাবে কী উদ্ধৃত করেছে তা ব্যাখ্যা করে। এই ব্যাখ্যা সম্পর্কে আপনি কি সম্পর্কে বিভ্রান্ত?
রবার্ট হার্ভে

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

5
@BleedingFingers প্রায়ই প্রোগ্রামিং বিভাগের যে শূন্য দিকে যায়, যেমন পূর্ণসংখ্যা ব্যবহার (-3)/2 == -1। এই সংজ্ঞাটি কার্যকর হতে পারে। আপনি যখন %এই বিভাগটির সাথে সামঞ্জস্য বজায় রাখতে চান আপনি সি # তে ব্যবহৃত x == (x/y)*y + x % yসংজ্ঞাটি শেষ করেন %
কোডসইনচওস

উত্তর:


7

সমস্ত আধুনিক কম্পিউটারের হার্ডওয়্যার কোনও (বা তুচ্ছ) পারফরম্যান্স প্রভাবের সাথে কোনও চিহ্নের মোড অপারেশনগুলি প্রয়োগ করতে যথেষ্ট শক্তিশালী। এটি কারণ নয়।

বেশিরভাগ কম্পিউটার ভাষার সাধারণ প্রত্যাশা হ'ল (একটি ডি বি) * বি + (একটি মোড বি) = ক। অন্য কথায়, ডিভ এবং মোড একত্রে বিবেচিত একটি সংখ্যাটিকে এমন অংশগুলিতে বিভক্ত করে যা নির্ভরযোগ্যভাবে আবার একসাথে ফিরে যেতে পারে। এই প্রয়োজনীয়তা সি ++ স্ট্যান্ডার্ডে স্পষ্ট। ধারণাটি বহুমাত্রিক অ্যারেগুলির সূচিকরণের সাথে নিবিড়ভাবে সম্পর্কিত। আমি এটি প্রায়শই ব্যবহার করেছি।

এ থেকে এটি দেখা যায় যে বিভ এবং ধনাত্মক (যেমনটি সাধারণত হয়) ডিভ এবং মোড একটি এর চিহ্নটি সংরক্ষণ করে।

কিছু ভাষা একটি 'রিম ()' ফাংশন সরবরাহ করে যা মোডের সাথে সম্পর্কিত এবং কিছু অন্যান্য গাণিতিক ন্যায়সঙ্গততা রয়েছে। আমার এটি ব্যবহার করার দরকার নেই। উদাহরণস্বরূপ Gnu সি তে ফ্রেম () দেখুন [সম্পাদনা]


আমি মনে করি এটি ইতিবাচক বা এটি যদি না হয় তবে এটি rem(a,b)আরও বেশি পছন্দ করে । mod(a,b)mod(a,b) + b
ব্যবহারকারী 40989

3
(a div b) * b + (a mod b) = a- এই, খুব অনেক। আসলে, কিভাবে উইকিপিডিয়া বর্ণনা বিপরীত ইউক্লিডিয় বিভাগের ঋণাত্মক সংখ্যা থেকে এটি ব্যাপ্ত (বিশেষ করে "বাকি মাত্র চার নম্বর নেতিবাচক হতে পারে না এক।") আমাকে বিভ্রান্ত কারণ আমি সবসময় শিখিয়েছিলেন যে বাকি পারেন নেতিবাচক হতে প্রতিটি স্তরের গণিত শ্রেণিতে।
ইজকাটা

@ ইউজার 40989: আমি বলেছিলাম আমি এটি কখনও ব্যবহার করব না। সম্পাদনা দেখুন!
david.pfx

4

প্রোগ্রামিংয়ের জন্য সাধারণত আপনি চান X == (X/n)*n + X%n; সুতরাং মডুলো কীভাবে সংজ্ঞায়িত হয় তা নির্ভর করে কিভাবে পূর্ণসংখ্যা বিভাগকে সংজ্ঞায়িত করা হয়েছিল।

এটি মাথায় রেখে, আপনি সত্যিই জিজ্ঞাসা করছেন " প্রোগ্রামিং ভাষার ডিজাইনাররা যখন পূর্ণসংখ্যা বিভাগ কীভাবে কাজ করে তা স্থির করে যখন কোন যুক্তি ব্যবহৃত হয়? "

এখানে প্রায় 7 টি পছন্দ রয়েছে:

  • নেতিবাচক অসীম থেকে বৃত্তাকার
  • ইতিবাচক অসীম থেকে বৃত্তাকার
  • গোল থেকে শূন্য
  • "বৃত্তাকার থেকে নিকটতম" এর বেশ কয়েকটি সংস্করণ (0.5 টির মতো কিছু গোল করার ক্ষেত্রে পার্থক্য সহ)

এখন বিবেচনা করুন -( (-X) / n) == X/n। আমি এটিকে সত্য হতে চাই, কারণ অন্য যে কোনও কিছুই অসঙ্গত বলে মনে হচ্ছে (এটি ভাসমান পয়েন্টের জন্য সত্য) এবং অযৌক্তিক (বাগের সম্ভাব্য কারণ এবং সম্ভাব্যভাবে মিস হওয়া অপ্টিমাইজেশন)। এটি পূর্ণসংখ্যা বিভাগের জন্য প্রথম 2 টি পছন্দকে (অনন্তের দিকে গোল করে) অনাকাঙ্ক্ষিত করে।

"রাউন্ড টু নিকটতম" সমস্ত পছন্দ প্রোগ্রামিংয়ের জন্য ঘাড়ে ব্যথা, বিশেষত যখন আপনি বিটম্যাপের মতো কিছু করেন (যেমন offset = index / 8; bitNumber = index%8;)।

এটি "সম্ভাব্য সর্বাধিক বুদ্ধিমান" পছন্দ হিসাবে শূন্যের দিকে গোলাকার ছেড়ে যায়, যা বোঝায় যে মডুলো অঙ্ক বা (শূন্য) হিসাবে একই চিহ্ন সহ একটি মান প্রদান করে।

দ্রষ্টব্য: আপনি আরও নোট করবেন যে বেশিরভাগ সিপিইউ (সমস্ত সিপিইউ যা আমি সচেতন) একই "বৃত্তাকার থেকে শূন্য" উপায়ে পূর্ণসংখ্যা বিভাগ করে। এটি একই কারণে হতে পারে।


তবে কাটা বিভাগের নিজস্ব অসামঞ্জস্যতাও রয়েছে: এটি ভেঙে যায় (a+b*c)/b == a % bএবং a >> n == a / 2 ** nযার জন্য মেঝে বিভাগের বুদ্ধিমান আচরণ রয়েছে।
dan04

আপনার প্রথম উদাহরণটি বোঝা যায় না। আপনার দ্বিতীয় উদাহরণটি প্রোগ্রামারদের জন্য একটি জগাখিচুড়ি: ধনাত্মক a এবং ধনাত্মক n এর জন্য এটি সামঞ্জস্যপূর্ণ, নেতিবাচক a এবং ধনাত্মক n এর জন্য এটি শিফট ডানকে কীভাবে সংজ্ঞায়িত করা হয় তার উপর নির্ভর করে (গাণিতিক বনাম লজিকাল), এবং নেতিবাচক n এর জন্য এটি ভাঙা হয়েছে (যেমন 1 >> -2 == a / 2 ** (-2))।
ব্রেন্ডন

প্রথম উদাহরণটি একটি টাইপো ছিল: আমার অর্থ (a + b * c) % b == a % b, %অপারেটর লভ্যাংশে বিভাজন-পর্যায়ক্রমিক, যা প্রায়শই গুরুত্বপূর্ণ। উদাহরণস্বরূপ, মেঝে বিভাগ সহ, day_count % 7আপনাকে সপ্তাহের দিন দেয় তবে কাটা বিভাগের সাথে, এটি যুগের আগে তারিখগুলির জন্য বিরতি দেয়।
dan04

0

প্রথমত, আমি পুনরুক্তি করব যে একটি মডুলো বি একটি - বি * (একটি ডি বি) এর সমান হওয়া উচিত, এবং যদি কোনও ভাষা এটি সরবরাহ না করে তবে আপনি একটি ভয়াবহ গাণিতিক জগতে। এই এক্সপ্রেশন a - b * (একটি ডি বি) আসলে কতগুলি বাস্তবায়ন একটি মডুলো বি গণনা করে।

কিছু সম্ভাব্য যুক্তি রয়েছে। প্রথমটি হ'ল আপনি সর্বাধিক গতি চান, সুতরাং প্রসেসরের ব্যবহৃত যা কিছু সরবরাহ করবে তা ডিভ বি হিসাবে সংজ্ঞায়িত করা হয়। যদি আপনার প্রসেসরের একটি "ডিভ" নির্দেশনা থাকে তবে ডিভ বি হ'ল ডিভ ইন্সট্রাকশন যা কিছু করে (যতক্ষণ না এটি সম্পূর্ণ উন্মাদ নয়)।

দ্বিতীয়টি হল আপনি কিছু নির্দিষ্ট গাণিতিক আচরণ চান। আসুন প্রথমে বি> 0 ধরে নেওয়া যাক এটি বেশ যুক্তিসঙ্গত যে আপনি চান একটি ডি বি এর ফলাফলটি শূন্যের দিকে গোল করা হোক। 4 ডিভ 5 = 0, 9 ডিভ 5 = 1, -4 ডিভ 5 = -0 = 0, -9 ডিভ 5 = -1। এটি আপনাকে (-a) ডিভ বি = - (একটি ডি বি) এবং (-এ) মডুলো বি = - (একটি মডুলো বি) দেয়।

এটি বেশ যুক্তিসঙ্গত তবে নিখুঁত নয়; উদাহরণস্বরূপ (a + b) ডিভ বি = (একটি ডি বি) +1 ধরে না, যদি একটি = -1 বলে। একটি নির্দিষ্ট b> 0 সহ, সাধারণত (খ) এর জন্য সম্ভাব্য মানগুলি থাকে যা একটি ডি বি একই ফল দেয়, 2 বি - 1 বাদে 1-বি + 1 থেকে বি -1 যেখানে ডিভ বি 0 সমান হয় এটির অর্থ হ'ল একটি মডুলো বি negativeণাত্মক হবে। আমরা চাই যে একটি মডুলো বি সর্বদা 0 থেকে বি -1 এর পরিসরে একটি সংখ্যা হয়।

অন্যদিকে, এটি অনুরোধ করাও যথেষ্ট যুক্তিসঙ্গত যে আপনি একটির ধারাবাহিক মানগুলির মধ্য দিয়ে চলার সাথে সাথে একটি মডিউলো বি 0 থেকে বি -1 এর মানগুলিতে যেতে হবে এবং আবার 0 দিয়ে শুরু করুন। এবং অনুরোধ করার জন্য (a + b) ডিভ বি হওয়া উচিত (একটি ডি বি) + ১। এটি অর্জনের জন্য, আপনি চান যে ডিভ বি এর ফলাফলটি -অনফিনিটির দিকে গোল করা উচিত, সুতরাং -১ ডি বি বি = -1। আবার, অসুবিধাগুলিও রয়েছে। (-a) Div b = - (একটি ডি বি) ধরে রাখে না। বারে বারে দুটি দ্বারা বা কোনও সংখ্যার দ্বারা বিভাজন <> 1 শেষ পর্যন্ত আপনাকে 0 এর ফলাফল দেয় না।

যেহেতু দ্বন্দ্ব রয়েছে তাই ভাষাগুলি সিদ্ধান্ত নিতে হবে যে কোন সেটগুলির সুবিধাগুলি তাদের পক্ষে বেশি গুরুত্বপূর্ণ এবং সেই অনুযায়ী সিদ্ধান্ত নিতে হবে।

নেতিবাচক খের জন্য, বেশিরভাগ লোকেরা প্রথম দিকে ডিভ বি এবং মডুলো বি কী হওয়া উচিত তার চারপাশে মাথা পেতে পারে না, তাই একটি সহজ উপায়টি নির্ধারণ করা হয় যে একটি ডিভ বি = (-এ) ডিভ (-বি) এবং a modulo b = (-a) modulo (-b) যদি b <0 হয়, বা কোডটি ইতিবাচক জন্য ব্যবহার করার প্রাকৃতিক ফলাফল যাই হোক না কেন।

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