প্রোগ্রামিং ভাষা দ্বারা মৌলিক গণিত কীভাবে দক্ষতার সাথে মূল্যায়ন করা হয়?


22

প্রোগ্রামিংয়ের পিছনে তত্ত্বের সাথে আমি যত বেশি যুক্ত হয়ে উঠি, নিজেকে আপাতদৃষ্টিতে সহজ জিনিসগুলি দেখে আমি মুগ্ধ ও বিস্মিত মনে করি .. আমি বুঝতে পারি যে বেশিরভাগ মৌলিক প্রক্রিয়া সম্পর্কে আমার বোঝার বৃত্তাকার যুক্তির মাধ্যমে ন্যায়সঙ্গত

প্রশ্ন : এটি কীভাবে কাজ করে?

উত্তর : কারণ এটি!

আমি এই উপলব্ধি ঘৃণা করি! আমি জ্ঞান পছন্দ করি এবং সর্বোপরি আমি শিখতে ভালোবাসি যা আমাকে আমার প্রশ্নের দিকে নিয়ে যায় (যদিও এটি একটি বিস্তৃত)।

প্রশ্ন:

মৌলিক গাণিতিক অপারেটররা কীভাবে প্রোগ্রামিং ভাষার সাথে মূল্যায়ন করা হয়?

বর্তমান পদ্ধতিগুলি কীভাবে উন্নত হয়েছে?

উদাহরণ

var = 5 * 5; 

আমার ব্যাখ্যা:

$num1 = 5; $num2 = 5; $num3 = 0;
while ($num2 > 0) {
    $num3 = $num3 + $num1;
    $num2 = $num2 - 1;
}
echo $num3;

এটি অত্যন্ত অদক্ষ বলে মনে হচ্ছে। উচ্চতর কারণগুলির সাথে, পদ্ধতিটিতে নির্মিত মানটি তাত্ক্ষণিক হলেও এই পদ্ধতিটি খুব ধীর। পুনরাবৃত্তি যুক্ত না করে আপনি কীভাবে গুণনকে অনুকরণ করবেন?

var = 5 / 5;

এটি কিভাবে করা হয়? আমি এটিকে আক্ষরিক অর্থে 5 সমান অংশে বিভক্ত করার কোনও উপায় ভাবতে পারি না।

var = 5 ^ 5; 

সংযোজনের পুনরাবৃত্তিগুলির আইট্রেটিস? আমার ব্যাখ্যা:

$base = 5;
$mod = 5;
$num1 = $base;
while ($mod > 1) {

    $num2 = 5; $num3 = 0;
    while ($num2 > 0) {
        $num3 = $num3 + $num1;
        $num2 = $num2 - 1;
    }
    $num1 = $num3;
    $mod -=1;
}
echo $num3;

আবার এটি অত্যন্ত অক্ষম, তবুও আমি এটি করার অন্য কোনও উপায় সম্পর্কে ভাবতে পারি না। এই একই প্রশ্নটি স্বয়ংক্রিয়ভাবে পরিচালিত সমস্ত গাণিতিক সম্পর্কিত ফাংশনগুলিতে প্রসারিত।


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

10
আপনি এন.ইউইকিপিডিয়া.আর / উইকি / ক্যাটাগরি: কম্পিউটার_রিদিমেটিকের সমস্ত লিঙ্ক দেখেছেন তা অনুমান করা কি নিরাপদ ?
জেবি কিং

2
মৌলিকভাবে, এটি আপনাকে প্রাথমিক বিদ্যালয়ে বহু-অঙ্কের গুণ এবং দীর্ঘ বিভাগ করতে শিখিয়েছে তার অনুরূপ। A এর একটি অঙ্ক নিন, দশ বার বি শিফট দিয়ে গুণ করুন। A এর পরবর্তী অঙ্কটি ধরুন, বি দিয়ে গুণ করুন সমস্ত অঙ্কের জন্য পুনরাবৃত্তি করুন, সমস্ত একসাথে যুক্ত করুন। এটি বাইনারি হওয়ার কারণে, একক অঙ্কের গুণটি আরও সহজ (এটি হয় এক্স 0 বা এক্স 1) এবং দশটি পরিবর্তনের পরিবর্তে আপনি দ্বিগুণ হন। বিভাগও একই রকম।
মনিকা সম্পর্কে জিজ্ঞাসা

উত্তর:


35

কোনও কম্পিউটারের মধ্যে পাটিগণিত কীভাবে কাজ করে তা সত্যিই বুঝতে আপনার সমাবেশের ভাষায় প্রোগ্রাম করা দরকার। সাধারণত একটি ছোট শব্দের আকার এবং গুণ এবং বিভাগ নির্দেশাবলী ছাড়াই একটি। 6502 এর মত কিছু।

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

তবে ওভারসিম্প্লিফাইটিং। যেহেতু 6502 একটি 8-বিট প্রসেসর, এটি কেবল 0 থেকে 255 পর্যন্ত সংখ্যা পরিচালনা করতে পারে। বেশিরভাগ সময় আপনি বৃহত্তর সংখ্যার সাথে কাজ করতে সক্ষম হতে চাইবেন। আপনাকে এগুলি খণ্ডগুলি যোগ করতে হবে, একবারে 8 টি বিট। প্রসেসরের একটি ক্যারি পতাকা রয়েছে যা দুটি সংখ্যা যুক্ত করার ফলাফল যখন অ্যাকিউমুলেটরকে উপচে ফেলে তখন সেট করা হয়। প্রসেসর যোগ করেছেন যে কোনও সংযোজন করার সময়, তাই এটি একটি সংখ্যার সর্বনিম্ন-অর্ডার বাইট দিয়ে শুরু করে ধরে নিয়ে "1 টি" বহন করতে ব্যবহৃত হতে পারে। 6502 তে একটি মাল্টি-বাইট অ্যাডটি দেখতে দেখতে:

  1. সাফ ক্যারি পতাকা (সিএলসি)
  2. প্রথম সংখ্যার সর্বনিম্ন-অর্ডার-বাইট লোড করুন (এলডিএ, লোড সংগ্রহকারী)
  3. দ্বিতীয় সংখ্যাটির সর্বনিম্ন-অর্ডার-বাইট যুক্ত করুন (এডিসি, বহন সহ যুক্ত করুন)
  4. ফলাফলের সর্বনিম্ন-অর্ডার বাইট সঞ্চয় করুন (এসটিএ, স্টোর জোগাড়কারী)
  5. ধারাবাহিকভাবে উচ্চতর অর্ডার বাইট সহ 2-4 পদক্ষেপ পুনরাবৃত্তি করুন
  6. যদি শেষে, ক্যারি সেট করা থাকে তবে আপনি উপচে পড়েছেন; যথাযথ ব্যবস্থা গ্রহণ করুন, যেমন কোনও ত্রুটি বার্তা উত্পন্ন করা (বিসিএস / বিসিসি, শাখা যদি সেট / ক্লিয়ার করে তবে)

বিয়োগফলটি একই রকম হয় আপনি প্রথমে বাহন সেট না করে, এডিসির পরিবর্তে এসবিসি নির্দেশ ব্যবহার করুন এবং শেষে বহনকারী ছিল কিনা তা বাহ্যটি পরিষ্কার

কিন্তু অপেক্ষা করো! নেতিবাচক সংখ্যা সম্পর্কে কি? ওয়েল, 6502 এর সাথে এগুলি দুটির পরিপূরক বলে একটি ফর্ম্যাটে সংরক্ষণ করা হয়। একটি 8-বিট সংখ্যা ধরে ধরে, -1 255 হিসাবে সংরক্ষণ করা হয়, কারণ আপনি যখন কোনও কিছুতে 255 যুক্ত করেন তখন আপনি অ্যাকিউমুলেটরটিতে একটি কম (প্লাস একটি ক্যারি) পান। -2 254 হিসাবে সংরক্ষণ করা হয় এবং পুরোভাবে -128 এর নিচে যা 128 হিসাবে সঞ্চিত হয়। সুতরাং স্বাক্ষরিত পূর্ণসংখ্যার জন্য, বাইটের অর্ধেক 0-255 পরিসরটি ইতিবাচক সংখ্যার জন্য এবং অর্ধেকটি নেতিবাচক সংখ্যার জন্য ব্যবহৃত হয়। (এই সম্মেলনটি আপনাকে সংখ্যার উচ্চ বিটটি নেতিবাচক কিনা তা পরীক্ষা করতে দেয়))

এটি 24 ঘন্টা ঘড়ির মতো ভাবুন: সময়টিতে 23 যোগ করার ফলে এক ঘন্টা আগে (পরের দিন) সময় আসবে। সুতরাং 23 হ'ল ঘড়ির মডুলার -1 এর সমতুল্য।

আপনি যখন 1 টি বাইটের বেশি ব্যবহার করছেন তখন আপনাকে sণাত্মকতার জন্য আরও বড় সংখ্যা ব্যবহার করতে হবে। উদাহরণস্বরূপ, 16-বিট পূর্ণসংখ্যার 0-65536 এর ব্যাপ্তি রয়েছে। সুতরাং 65535 -1 উপস্থাপন করতে ব্যবহৃত হয় এবং তাই, কারণ যে কোনও সংখ্যায় 65535 যুক্ত করা হলে এর কম ফলাফল হয় (প্লাস একটি ক্যারি)।

6502 এ কেবল চারটি পাটিগণিত ক্রিয়াকলাপ রয়েছে: যোগ করুন, বিয়োগ করুন, দুটি দ্বারা গুন করুন (বাম দিকে), এবং দুটি দ্বারা বিভাজক (ডানদিকে)। বাইনারি নিয়ে কাজ করার সময় কেবল এই ক্রিয়াকলাপগুলি ব্যবহার করে গুণ ও বিভাগ করা যেতে পারে। উদাহরণস্বরূপ, 5 (বাইনারি 101) এবং 3 (বাইনারি 11) গুণনের কথা বিবেচনা করুন। দশমিক দীর্ঘ গুন হিসাবে, আমরা গুণকের ডান ডিজিট দিয়ে শুরু করি এবং 101 দিয়ে 1 দিয়ে 101 গুন করি। তারপরে আমরা বহু গুণ বাম দিকে সরিয়ে 1010 দিয়ে 110 দিয়ে গুণ করব। তারপরে আমরা এই ফলাফলগুলি এক সাথে যুক্ত করব, 1111, বা 15. যেহেতু আমরা সর্বদা কেবল 1 বা 0 দ্বারা গুণ করি, তাই আমরা সত্যিকার অর্থেই গুণ করি না; গুণকের প্রতিটি বিট কেবল একটি পতাকা হিসাবে পরিবেশন করে যা আমাদের বলে যে (স্থানান্তরিত) গুণকটি যুক্ত করতে হবে কি না।

বিভাগ বাইনারি বাদে ট্রায়াল বিভাজক ব্যবহার করে ম্যানুয়াল দীর্ঘ বিভাগের সাথে সমান। যদি আপনি একটি ধ্রুবক দ্বারা বিভাজন করছেন, এটি বিয়োগের সাথে উপযোগী উপায়ে এটি করা সম্ভব: এক্স দ্বারা বিভাজন না করে আপনি 1 / X এর একটি প্রাক্কলিত উপস্থাপনা দ্বারা গুণিত করুন যা কাঙ্ক্ষিত ফলাফল এবং একটি ওভারফ্লো উত্পাদন করে। আজও এটি বিভাগের চেয়ে দ্রুত is

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

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


3
আরে, আপনার খুব বিস্তারিত ব্যাখ্যার জন্য আপনাকে ধন্যবাদ! আমি যা চেয়েছিলাম ঠিক তাই! আমার স্তরে থাকাকালীন, আপনি প্রায়শই ভুলে যান যে আপনাকে যা সমর্থন করছে তা সাধারণত আপনি যা করছেন তার চেয়ে জটিল। আমি কম্পিউটার বিজ্ঞান পড়তে চাইবার সঠিক কারণ reason আমি এই সত্যকে ঘৃণা করি যে আমি যদি সময়মতো ফিরে যাই তবে আমি পৃথিবী পরিবর্তনের কিছুই জানতাম না, কীভাবে একটি সঠিক এসকিউএল বিবৃতি প্রণয়ন করতে পারি;) যে কোনও হারে, এই উত্তরটি লেখার জন্য সময় ব্যয় করার জন্য আপনাকে অনেক ধন্যবাদ, আমি যে বিষয়টি প্রকাশ করতে চলেছি তাতে আপনি আমাকে একটি স্বাদ পরীক্ষক দিয়েছেন।
Korvin Szanto

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

অঁ্যা। একবার আপনি যদি জানতে পারেন যে এখানে অ্যাডার এবং শিফটার রয়েছে, তবে এটি সহজেই সফ্টওয়্যার দ্বারা হার্ডওয়্যার দ্বারা নিয়ন্ত্রিত সেগুলি কল্পনা করা সহজ এবং সফ্টওয়্যার দিয়ে খেলা আরও সহজ।
শে

4
-1। হার্ডওয়্যার মাল্টিপল শিফট দিয়ে করা হয়নি এবং প্রায় 3 দশক ধরে যুক্ত হয়েছে এবং অনেক সিপিইউ একটি চক্রের মধ্যে একটি গুণ করতে পারে। Binary Multiplierবিস্তারিত জানার জন্য উইকিপিডিয়া নিবন্ধটি দেখুন।
ম্যাসন হুইলারের

24

শেষ পর্যন্ত, হার্ডওয়্যারে বেসিক পাটিগণিত অপারেশন করা হয়। আরও সুনির্দিষ্টভাবে, সিপিইউতে (বা প্রকৃতপক্ষে এর একটি উপ-বিভাগ)

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

http://en.wikipedia.org/wiki/Adder_%28electronics%29

http://en.wikipedia.org/wiki/Binary_multiplier


3
হার্ডওয়্যারটির জন্য অ্যালগোরিদমগুলি সাবধানতার সাথে নির্দিষ্ট করা হয়েছে এবং হার্ডওয়্যার থেকে পৃথক অধ্যয়ন করা যেতে পারে।
এস.লোট

@ এস.লোট: আপনার মন্তব্যটি আমি বিভ্রান্তিকর মনে করি। আমার কাছে, অ্যালগরিদমগুলি আপনি অনুসরণ করেন এমন একটি পদক্ষেপ, একটি পদ্ধতি, এমন কিছু যা আপনি প্রোগ্রাম করতে পারেন তাতে জড়িত। এখানে, আমরা মৌলিক পাটিগণিত ক্রিয়াকলাপগুলি সম্পাদন করে বৈদ্যুতিন সার্কিট সম্পর্কে কথা বলছি। অন্য কথায়, গেটের বর্তমান ক্রম যেখানে কেবল প্রবাহিত হয়। সুতরাং এটি সেরা "অ্যালগরিদমিক" এর চেয়ে বেশি "যৌক্তিক"। ... আমার 2 সেন্ট।
ডাগলিনিগুলি

6
একটি অ্যালগরিদম হ'ল "সীমাবদ্ধ, সুনির্দিষ্ট এবং কার্যকর" এটি সার্কিটে হতে পারে, বা কাগজ এবং পেন্সিল দিয়ে করা যায়, বা টিঙ্কারটোয় বা অণু দ্বারা একটি থালা বা ডিএনএতে করা যেতে পারে। অ্যালগরিদম যে কোনও কিছু হতে পারে। একটি বৈদ্যুতিন সার্কিট একটি সংজ্ঞায়িত অ্যালগরিদম অনুসরণ করতে হবে। এটি অ্যালগরিদমের প্রয়োজনীয়তাকে যাদুকরীভাবে শেষ করে না।
এসলট

1
কেবল একটি পদক্ষেপ নিয়ে গঠিত এমন একটি প্রক্রিয়া কি "অ্যালগরিদম" হিসাবে বিবেচিত হবে? FWIW, বৈদ্যুতিন সার্কিট সাধারণত একটি সত্য টেবিল অনুসরণ করে - একটি একক পদক্ষেপ প্রক্রিয়াজাতকরণ। যে সত্যের টেবিলটি বহু-স্তরযুক্ত গেটগুলিতে "সংকলিত" হওয়া শেষ হয়েছে এটি সত্য যে এটি একটি একক পদক্ষেপ প্রক্রিয়াটিকে অস্বীকার করে না।
slebetman

2
@ এস.লট: আরও উপযুক্ত প্রথম মন্তব্যটি হ'ল: হার্ডওয়ারের "যুক্তি" সাবধানতার সাথে নির্দিষ্ট করা হয়েছে এবং হার্ডওয়্যার থেকে পৃথক অধ্যয়ন করা যেতে পারে। এবং প্রকৃতপক্ষে এটি হয়। বাইনারি যুক্তির অধ্যয়নকে বলা হয় বুলিয়ান বীজগণিত।
slebetman

6

ডন নুথের দ্য আর্ট অফ কম্পিউটার প্রোগ্রামিংয়ে এগুলি পুরোপুরি ধৈর্য সহ .াকা রয়েছে।

যোগ, বিয়োগ, গুণ এবং ভাগের জন্য কার্যকর অ্যালগরিদমগুলি সম্পূর্ণ বিবরণে বর্ণিত।

আপনি এই জাতীয় জিনিসগুলি কভার বিভাগটি সুন্দরভাবে পড়তে পারেন।

http://research.microsoft.com/pubs/151917/divmodnote.pdf


5

এটি পিকোসেকেন্ডগুলিতে বৈদ্যুতিন সার্কিট দ্বারা সম্পন্ন হয়েছে। গুগল 'হার্ডওয়্যার গুণক' ইত্যাদি। আধুনিক সিপিইউগুলি কয়েক দশকের একটানা উন্নতির চরম জটিল ফল are

বিটিডাব্লু, যেহেতু আপনি বারবার সংযোজন দ্বারা গুণ করবেন না, আপনি কেন একটি কম্পিউটার কল্পনা করবেন?


আমার প্রশ্নটি ফাংশনগুলি না করে নিজের কার্যকারণের পিছনে যুক্তি সম্পর্কিত, আমি বুঝতে পারি যে এটি প্রসেসরের দ্বারা ব্যাখ্যা করা হয়েছে, আমি কীভাবে আগ্রহী। বিশেষত এর পেছনের তত্ত্ব এবং কীভাবে এটি ছদ্ম-কোডে প্রতিলিপি করা যেতে পারে।
কোরভিন জ্যাজানো

1
আমি আমার মাথায় যে গুণটি করি তা হ'ল স্মৃতি। এছাড়াও দীর্ঘ গুণটির জন্য আমি যেভাবে এটি করেছি তার পুনরাবৃত্তি প্রয়োজন। আমি এগিয়ে যাব এবং দীর্ঘ
গুনের

2
@ কোরভিন, আমি প্রস্তাবিত বইটি আপনার আগ্রহের বিষয় হলে আপনাকে ভালভাবে পরিবেশন করবে। হ্যারল্ড আবেলসন এবং জেরাল্ড জে সুসমানের "কম্পিউটার প্রোগ্রামার স্ট্রাকচার এবং ব্যাখ্যার" সুপারিশ করছি। এটি গভীরতার সাথে এই প্রশ্নগুলির সাথে ডিল করে।
জোনাথন হেনসন

বেশ কয়েকটি প্রাথমিক কম্পিউটার কেবল সংযোজন এবং বিয়োগফলকে সমর্থন করে। কিছু কেবলমাত্র বিয়োগফলকে সমর্থন করে! সুতরাং x = y * z অপারেশনটি do (z বার) হিসাবে প্রয়োগ করা হয়েছিল {x + y} একইভাবে বিভাগ x = y / z হিসাবে প্রয়োগ করা হয়েছিল (y> z) {x + 1; y = y - z}
জেমস অ্যান্ডারসন

@ জেমস: তারা কি শিফটকে সমর্থন করেছিল? আমি আশা করবো যে শিফট এবং অ্যাডের মাধ্যমে গুণকটি হয়েছে, যখন বিভাগটি শিফট, তুলনা, বিয়োগফল।
কেভিন cline

4

এটি কোনও উপায়ে পুরো উত্তর হিসাবে বোঝানো নয় তবে জিনিসগুলি কীভাবে প্রয়োগ করা হয় তা আপনাকে কিছু ধারণা দেওয়া উচিত। আপনি সম্ভবত জানেন যে বাইনারি সংখ্যা প্রতিনিধিত্ব করা হয়। উদাহরণস্বরূপ, একটি কম্পিউটার 5000 সংখ্যাটি 00000101 হিসাবে উপস্থাপন করতে পারে A একটি খুব প্রাথমিক কাজকর্ম যা কম্পিউটার করতে পারে তা হল শিফট বাম, যা 00001010 দেবে যে দশমিক দশম it প্রতিবার আমরা অঙ্কগুলি বামে 1 বার স্থানান্তরিত করার সময় আমরা সংখ্যাটি দ্বিগুণ করি। বলুন যে আমার কাছে একটি সংখ্যা ছিল এবং আমি এটি 17 দিয়ে গুণ করতে চেয়েছিলাম I আমি 4 বার বাম দিকে স্থানান্তর করতে এবং তারপরে ফলাফলটি যুক্ত করতে পারি (16x + x = 17x)। এটি একটি সংখ্যা 17 দ্বারা গুণিত করার একটি কার্যকর উপায় হবে This এটি আপনাকে বারবার সংযোজন না করে কম্পিউটার কীভাবে বড় সংখ্যাকে গুণ করতে পারে তার কিছুটা অন্তর্দৃষ্টি দেয়।

বিভাগ সংযোজন, বিয়োগফল, শিফট ডান, শিফট বাম ইত্যাদির সংমিশ্রণগুলি ব্যবহার করতে পারে exp


কেবল স্পষ্ট করে বলতে গেলে, আপনি সাধারণত একবারে একাধিক বিট বদল করতে পারেন। সুতরাং যারা 4 শিফট অপারেশন আসলে শুধু একটা অপারেশন মত: shl r0, 4
কালেব

4

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

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

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

পূর্ণসংখ্যা ইউনিট, ভাসমান পয়েন্ট ইউনিট, জিপিইউ এবং ডিএসপি সিলিকনে সেই সমস্ত পুরানো কৌশলগুলি কেবল প্রয়োগ করে।


3

ডিজিটাল প্রসেসিং সমস্যাগুলি সমাধান করার জন্য আপনার উদ্ভূত সমস্যাগুলি ব্যবহার করে ডিজিটাল সার্কিটগুলি কীভাবে ডিজাইন করা হয়েছে তার একটি ধারণা দেওয়ার চেষ্টা করব: সিপিইউ কীভাবে সংযোজন এবং গুণগুলি বাস্তবায়ন করে।

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

a = 1 + 1;
b = a * 20;

কেবল এমন কিছুতে সংকলিত হয়:

ADD 1 1  a
MUL a 20 b

(দ্রষ্টব্য, উপরের সমাবেশটি একটি কাল্পনিক সিপিইউর জন্য যা বিদ্যমান নেই, সরলতার জন্য)।

এই মুহুর্তে আপনি বুঝতে পারবেন যে উপরের উত্তরটি কেবল সমস্যাটি স্থানান্তরিত করে এবং হার্ডওয়্যার যাদু দ্বারা এটি সমাধান করে। ফলো-আপ প্রশ্নটি স্পষ্টতই সেই হার্ডওয়্যার ম্যাজিকটি কীভাবে কাজ করে?

প্রথমে সহজ সমস্যাটি দেখে নেওয়া যাক: সংযোজন।

প্রথমে আমরা একটি নিয়মিত বেস 10 নম্বর যোগ করে একটি পরিচিত সমস্যা করি:

 17
+28

প্রথম পদক্ষেপটি 7 এবং 8 যোগ করা হবে তবে এটি 15 এর ফলাফল যা একক অঙ্কের চেয়ে বেশি। সুতরাং আমরা 1 বহন:

(1)
 17
+28
= 5

এখন আমরা 1, 1 এবং 2 একসাথে যুক্ত করব:

 17
+28
=45

সুতরাং এটি থেকে আমরা নিম্নলিখিত নিয়ম পেতে:

  1. সংযোজনের ফলাফল যখন এক অঙ্কের বেশি হয়, আমরা সর্বনিম্ন উল্লেখযোগ্য সংখ্যা রাখি এবং সর্বাধিক উল্লেখযোগ্য অঙ্ক এগিয়ে রাখি

  2. আমাদের কলামে যদি একটি অঙ্ক এগিয়ে নিয়ে যায় তবে আমরা সংখ্যার সাথে যুক্ত করব

এখন সময়টি বেস 2 - বুলিয়ান বীজগণিতের উপরের বিধিগুলি ব্যাখ্যা করার জন্য।

সুতরাং বুলিয়ান বীজগণিতের সাথে, 0 এবং 1 একসাথে যোগ করে = 1. যোগ করা 0 এবং 0 = 0. যোগ করা এবং 1 এবং 1 = 10 যোগ করা যা এক অঙ্কের বেশি, তাই আমরা 1টিকে এগিয়ে রাখি।

এটি থেকে আমরা একটি সত্য সারণী তৈরি করতে পারি:

a b  |  sum  carry
-------------------
0 0  |   0     0
0 1  |   1     0
1 0  |   1     0
1 1  |   0     1

এর থেকে, আমরা দুটি সার্কিট / বুলিয়ান সমীকরণ তৈরি করতে পারি - একটি যোগফলের জন্য এবং একটি বহন করার আউটপুট জন্য। সর্বাধিক নিষ্পাপ উপায় হ'ল সমস্ত ইনপুটগুলি কেবল তালিকাভুক্ত করা। যে কোনও সত্যের ছক, এই ফর্মটিতে যত বড় এবং জটিল তা পুনঃস্থাপন করা যায়:

(AND inputs in first row) OR (AND of inputs in second row) OR ...

এটি মূলত পণ্য ফর্মের যোগফল। আমরা কেবল আউটপুটগুলিতেই দেখি যার ফলে 1 ফলাফল হয় এবং 0 টি উপেক্ষা করুন:

sum = (NOT a AND b) OR (a AND NOT b)

পড়ার সহজ করে তুলতে প্রোগ্রামের ভাষা প্রতীকগুলির সাথে এবং এর এবং না প্রতিস্থাপন করা যাক:

sum = (!a & b) | (a & !b)

মূলত, আমরা টেবিলটি এমনভাবে রূপান্তর করেছি:

a b  |  sum  equation
-------------------
0 0  |   0   
0 1  |   1   (!a & b)
1 0  |   1   (a & !b)
1 1  |   0   

এটি সরাসরি একটি সার্কিট হিসাবে প্রয়োগ করা যেতে পারে:

                _____
 a ------------|     |
    \          | AND |-.     ____
     \  ,-NOT--|_____|  \   |    |
      \/                 `--| OR |----- sum
      /\        _____    ,--|____|
     /  `-NOT--|     |  /
    /          | AND |-`
 b ------------|_____|

পর্যবেক্ষক পাঠকগণ এই মুহুর্তে লক্ষ্য করবেন যে উপরের যুক্তিগুলি একটি একক গেট হিসাবে বাস্তবে প্রয়োগ করা যেতে পারে - একটি এক্সওআর গেট যা আমাদের সত্য টেবিলের দ্বারা স্বাচ্ছন্দ্যে প্রয়োজনীয় আচরণ করে:

                _____
 a ------------|     |
               | XOR |---- sum
 b ------------|_____|

তবে যদি আপনার হার্ডওয়্যার আপনাকে একটি এক্সওর গেট সরবরাহ করে না, তবে উপরের পদক্ষেপগুলি কীভাবে আপনি এটি, এবং, এবং নো গেটস এর শর্তায় এটি সংজ্ঞায়িত ও প্রয়োগ করতে যাবেন।

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

এখন আমরা বহন সংকেত জন্য একই কাজ। যেহেতু কেবল একটি শর্ত আছে যেখানে বহন সংকেতটি সত্য, সমীকরণটি কেবল সহজ:

carry = a & b

সুতরাং বহন সহজ:

                _____
 a ------------|     |
               | AND |---- carry
 b ------------|_____|

তাদের একত্রিত করে আমরা অর্ধ সংযোজক হিসাবে পরিচিত যা পাই:

                _____
 a ------;-----|     |
         |     | XOR |---- sum
 b --;---|-----|_____|
     |   |      _____
     |   '-----|     |
     |         | AND |---- carry
     '---------|_____|

উপরের সার্কিটের জন্য সমীকরণগুলি দেখায়:

sum = a ^ b
carry = a & b

অর্ধযোজক কিছু অনুপস্থিত। আমরা প্রথম নিয়মটি প্রয়োগ করেছি - যদি ফলাফল এগিয়ে নিয়ে যাওয়ার চেয়ে এক অঙ্কের বেশি হয় তবে আমরা দ্বিতীয় বিধিটি প্রয়োগ করি নি - যদি কোনও বাহন থাকে তবে এটি সংখ্যার সাথে একত্রে যুক্ত করুন।

সুতরাং একটি পূর্ণ সংযোজনকারী, একটি সংযোজন সার্কিট যা এক অঙ্কের বেশি সংখ্যক সংখ্যক যুক্ত করতে পারে তা বাস্তবায়নের জন্য আমাদের একটি সত্যের ছকটি সংজ্ঞায়িত করতে হবে:

a b c  |  sum  carry
---------------------
0 0 0  |   0     0
0 0 1  |   1     0
0 1 0  |   1     0
0 1 1  |   0     1
1 0 0  |   1     0
1 0 1  |   0     1
1 1 0  |   0     1
1 1 1  |   1     1

যোগফলের সমীকরণ এখন:

sum = (!a & !b & c) | (!a & b & !c) | (a & !b & !c) | (a & b & c)

আমরা সমীকরণটি ফ্যাক্ট করতে এবং সমীকরণটিকে সরলীকরণ করতে এবং এটি একটি সার্কিট ইত্যাদি হিসাবে ব্যাখ্যা করার জন্য একই পদ্ধতিতে যেতে পারি যেমন আমরা উপরে করেছি তবে আমি মনে করি এই উত্তর অত্যধিক দীর্ঘায়িত হচ্ছে।

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

  1. আপনি একক বিট (অঙ্ক) স্তরে কাজ করতে না পারলে সমস্যাটি কমিয়ে দিন।

  2. আপনি সত্যের সারণীটি ব্যবহার করতে চান এমন ফলাফলগুলি সংজ্ঞায়িত করুন।

  3. টেবিলটিকে বুলিয়ান সমীকরণে রূপান্তর করুন এবং সমীকরণটি সহজ করুন।

  4. সমীকরণটিকে লজিক গেট হিসাবে ব্যাখ্যা করুন।

  5. লজিক গেটগুলি প্রয়োগ করে আপনার লজিক সার্কিটটিকে আসল হার্ডওয়্যার সার্কিটগুলিতে রূপান্তর করুন।

এটিই কীভাবে মৌলিক (বা বরং নিম্ন স্তরের) সমস্যাগুলি সমাধান করা হয় - প্রচুর এবং সত্যের অনেকগুলি সারণী। আসল সৃজনশীল কাজটি এমপিথ্রি ডিকোডিংয়ের বিট লেভেলের মতো জটিল কাজটি ভেঙে ফেলা হচ্ছে যাতে আপনি সত্যের টেবিলগুলি নিয়ে এটিতে কাজ করতে পারেন।

দুঃখিত, আমি কীভাবে গুণনকে বাস্তবায়ন করতে পারি তার ব্যাখ্যা করার সময় আমার কাছে নেই। গুণমান কতক্ষণ কাজ করে তার নিয়মগুলি সনাক্ত করে আপনি এটি বাইনারি ভাষায় ব্যাখ্যা করার পরে এটি সত্যের টেবিলগুলিতে ভেঙে ফেলার চেষ্টা করতে পারেন। অথবা আপনি উইকিপিডিয়া: http://en.wikedia.org/wiki/Bাইন__ মাল্টিপ্লায়ার পড়তে পারেন


2

বেসিক পাটিগণিত নির্দেশাবলী সমাবেশ নির্দেশাবলী যা অত্যন্ত দক্ষ হয় সঙ্গে সঞ্চালিত হয়।

আরও জটিল (বা বিমূর্ত) নির্দেশাবলী হয় লুপিং পদ্ধতিতে সমাবেশে করা হয় বা স্টাড লিবগুলিতে পরিচালনা করা হয়।

আপনি যখন কলেজে গণিত অধ্যয়ন করেন আপনি ল্যাম্বদা ক্যালকুলাস এবং বিগ-ও স্বরলিপি জাতীয় জিনিস অধ্যয়ন শুরু করবেন। এই সমস্ত এবং আরও অনেকগুলি প্রোগ্রামাররা মূল্যায়ন ও দক্ষ অ্যালগরিদম তৈরি করতে ব্যবহার করে। যাইহোক, বেসিক স্টাফগুলি সাধারণত নিম্ন স্তরে সম্পন্ন হয় যেমন সমাবেশে বা সি দ্বারা পয়েন্টার সহ।

এই বিষয়টির একটি দুর্দান্ত ভূমিকা চার্লস পেটজোল্ডের "কোড"।


1
বা সারণী অনুসন্ধান। মানগুলিকে প্রাক্পম্প্ট করা এবং সেগুলি অনুসন্ধান করার জন্য আরও দ্রুত। উদাহরণ সিন / কোস / ট্যান (যদিও এটি প্রি-কম্পিউটেড এবং হার্ডওয়্যারে সঞ্চিত) পূর্ণসংখ্যা বিভাগ।
মার্টিন ইয়র্ক

1

ডিজিটাল লজিকের ফান্ডামেন্টালগুলির মতো একটি বই পান ... যা আমি মনে করি এখনও ফ্রেশম্যান / সোফমোর ইই শিক্ষার্থীদের জন্য বেশ মানক এবং এটির মাধ্যমে আপনার কাজ করুন (সম্পাদনা: এটি একটি ছোট ভাগ্যের জন্য ব্যয় করে, তাই এর ব্যবহৃত বা পূর্ববর্তী সংস্করণটি সন্ধান করুন) এটা)। এটি আপনাকে সংযোজক এবং গুণকগুলির মধ্য দিয়ে নিয়ে যাবে এবং হার্ডওয়্যার কী করছে তার পিছনে কিছু নীতি বুঝতে শুরু করার জন্য আপনাকে যথেষ্ট পটভূমি দেবে।

আপনার উত্তরটি, স্বল্পমেয়াদে "হয়ে যাবে" কারণ এই জটিল আচরণটিকে "পরিবর্তে" পরিবর্তিত করতে "কারণ" এর পরিবর্তে এটি সরল যুক্তির টুকরো টুকরো করে একসাথে ফিট করে fits

প্রোগ্রামগুলি কীভাবে সংকলিত হয় এবং চালিত হয় তার সমস্ত নীতিগুলি যদি আপনি বুঝতে চেষ্টা করতে চান তবে এর সাথে মিলিয়ে যান, যাতে আপনি শেষ পর্যন্ত দেখতে পারেন কীভাবে সবকিছু মাঝখানে মিলিত হয়।


1

এখানে অনেক ভাল উত্তর আছে। আপনি সঠিক ধারণা দিয়েও শুরু করেছেন: গুণনের মতো জটিল ক্রিয়াকলাপগুলি সহজ অপারেশন থেকে তৈরি built যেমন আপনি অনুমান করেছেন, একাধিক সংখ্যক সংযোজন সংযোজন ব্যবহারের চেয়ে গুণ গুণ ছাড়াই গুণনের দ্রুত উপায় রয়েছে। যেকোন গুণকে ছোট গুনের যোগফল হিসাবে বা শিফ্ট এবং সংযোজনগুলির সংমিশ্রণ হিসাবে প্রয়োগ করা যেতে পারে। উদাহরণ:

a = 5 + 5 + 5 + 5 + 5;           // 5*5, but takes 5 operations
b = (5 << 2) + 5;                // 5*5 in only 2 operations
c = (41 << 4) + (41 << 2) + 41   // 41*21 in 4 operations

বিভাগটি একইভাবে ছোট অপারেশনে বিভক্ত হতে পারে। এক্সওআর (^) হ'ল প্রতিটি প্রসেসরের একটি অন্তর্নিহিত নির্দেশনা যা আমি কখনও দেখেছি, তবুও এটি AND, OR, এবং না এর সংমিশ্রণ হিসাবে প্রয়োগ করা যেতে পারে।

প্রসেসর যে ধরণের নির্দেশনা সরবরাহ করে এবং কীভাবে সেই নির্দেশাবলীকে আরও জটিল ক্রিয়াকলাপের সাথে সংযুক্ত করা যায় তার সাধারণ ধারণার চেয়ে এই উত্তরগুলি আপনার কাছে কম সন্তুষ্ট হবে যদিও আমার একটি অনুভূতি রয়েছে। এই জাতীয় কৌতূহলের জন্য সমাবেশ ভাষার সুস্বাস্থ্যের চেয়ে ভাল আর কিছু নেই। এখানে এমআইপিএস অ্যাসেম্বলি ভাষার একটি খুব কাছে পৌঁছনীয় ভূমিকা।


1

একটি আধুনিক প্রসেসর কীভাবে দুটি দুটি বিট পূর্ণসংখ্যার গুণকে প্রয়োগ করতে পারে তা এখানে:

আপনি কীভাবে লম্বা হাতের গুণটি করবেন তা জানেন। দুটি 10 ​​সংখ্যার সংখ্যাকে গুণ করতে, আপনি অন্য সংখ্যার 10 টি সংখ্যার প্রত্যেকের দ্বারা 10 টি সংখ্যার সংখ্যাটি গুণবেন, 11 সংখ্যার ফলাফলকে অন্যের নীচে লিখবেন এবং স্থানান্তরিত করুন, তারপরে সমস্ত সংখ্যা যুক্ত করুন।

একটি আধুনিক প্রসেসর এটি সমস্ত 64 বাই 64 বিটের সাহায্যে করে। তবে দুটি একক বিট সংখ্যার গুণ খুব সহজ: 1 x 1 = 1, অন্যান্য সমস্ত পণ্য শূন্য। এটি একটি যৌক্তিক এবং দিয়ে প্রয়োগ করা হয়। এবং দশমিক পণ্যটির বিপরীতে, যেখানে ফলাফলটি দুটি অঙ্ক হতে পারে, একক বিট সংখ্যার একটি বাইনারি পণ্য সর্বদা এক বিট থাকে।

সুতরাং এখন আপনার কাছে 64 বিটের 64 টি সারি রয়েছে যা যুক্ত করা দরকার। তবে bit৪ বিট সংখ্যার addition৪ সংযোজনগুলি হ'ল স্লুওউউ। প্রসেসরটি 3/2 সংযোজনকারী বা 7/3 অ্যাডারের ব্যবহার করে: আপনি যদি 3 টি একক বিট সংখ্যা যুক্ত করেন তবে ফলাফলটি 0, 1, 2 বা 3 হতে পারে যা দুটি বিটের মধ্যে ফিট করে। আপনি যদি 7 টি একক বিট সংখ্যা যুক্ত করেন তবে ফলাফলটি 0 থেকে 7 পর্যন্ত একটি সংখ্যা, যা 3 বিট দ্বারা প্রতিনিধিত্ব করা যেতে পারে। আইবিএম দাবি করেছে যে তারা মাত্র 18 আদিম সার্কিট (পাওয়ারপিসি ডকুমেন্টেশন) দিয়ে 7/3 সংযোজক তৈরি করতে পারে, আমি বাজি ধরছি ইন্টেল এবং এআরএমও এটি করতে পারে।

আপনার কাছে 4096 বিট রয়েছে, এগুলিকে একই বিট পজিশনে 7 বিটের প্রায় 600 টি গ্রুপে গ্রুপ করুন এবং ফলাফলটি 4096 বিট থেকে ২ হাজারেরও কম করতে প্রায় 600 7/3 অ্যাডারের ব্যবহার করুন। তারপরে আপনি আবার একই জিনিসটি করেন এবং আবারও, যতক্ষণ না আপনি জোড় বিটগুলি শেষ করেন যা কোনও সাধারণ পূর্ণ অ্যাড্রেয়ারকে খাওয়ানো যেতে পারে।

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