স্ট্যান্ডার্ড সি ++ লাইব্রেরিতে `ইন্ট পাও (ইনট বেস, ইনট এক্সপোনেন্ট) isn't কেন নয়?


116

আমার মনে হচ্ছে আমি এটি সন্ধান করতে সক্ষম হব না। সি ++ powফাংশন floatএস এবং doubleএস ব্যতীত কোনও কিছুর জন্য "পাওয়ার" ফাংশন বাস্তবায়ন করে না এমন কোনও কারণ আছে কি ?

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


4
এটি একটি ভাল প্রশ্ন, এবং আমি উত্তরগুলি অনেক অর্থবোধ করি না বলে মনে করি। নেতিবাচক প্রকাশকারীরা কাজ করে না? স্বাক্ষরবিহীন ints অভিশংসক হিসাবে নিন। বেশিরভাগ ইনপুটগুলি এটিকে ওভারফ্লোতে ডেকে আনে? এক্সপেট এবং ডাবল পাওয়ের ক্ষেত্রে একই কথা, আমি কাউকে অভিযোগ করতে দেখি না। তাহলে কেন এই ফাংশনটি স্ট্যান্ডার্ড নয়?
স্ট্যাটিক_আরটি

2
@ স্ট্যাটিক_আরটি: "এক্সপ্রেস এবং ডাবল পাওয়ের ক্ষেত্রে এটি একই" সম্পূর্ণ মিথ্যা। আমি আমার উত্তরে বিস্তারিত জানাব।
স্টিফেন ক্যানন

11
Standard C ++ লাইব্রেরির হয়েছে double pow(int base, int exponent)সি ++ 11 (§26.8 [c.math] / 11 বুলেট পয়েন্ট 2) যেহেতু
Cubbi

'বাস্তবায়ন তুচ্ছ' এবং 'লেখার মজা নয়' এর মধ্যে আপনাকে নিজের মন তৈরি করতে হবে।
লার্নের মারকুইস

উত্তর:


66

হিসাবে C++11, পাওয়ার ফাংশনগুলির স্যুটটিতে (এবং অন্যদের) বিশেষ কেস যুক্ত করা হয়েছিল। C++11 [c.math] /11সমস্ত float/double/long doubleওভারলোডগুলি তালিকাভুক্ত করার পরে (আমার জোর এবং প্যারাফ্রেসড) বলেছেন:

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

সুতরাং, মূলত, সংখ্যার পরামিতিগুলি অপারেশন সম্পাদন করতে ডাবলগুলিতে আপগ্রেড করা হবে।


এর আগে C++11(যা আপনার প্রশ্ন জিজ্ঞাসা করা হয়েছিল) আগে কোনও পূর্ণসংখ্যার ওভারলোডের অস্তিত্ব ছিল না।

যেহেতু আমি তন্ন তন্ন ঘনিষ্ঠভাবে এর নির্মাতাদের সঙ্গে যুক্ত ছিল Cনা C++তাদের সৃষ্টি দিনের মধ্যে (যদিও আমি নই বরং পুরানো), বা ANSI / আইএসও কমিটি যে মান নির্মিত অংশ, এই অগত্যা আমার পক্ষ থেকে মতামত। আমি এটা ভাবতে চাই অবহিত মতামত তবে আমার স্ত্রী যেমনটি আপনাকে বলবেন (ঘন ঘন এবং খুব বেশি উত্সাহের প্রয়োজন নেই), আমি আগে ভুল করেছি :-)

অনুমান, এটি মূল্যবান জন্য নিম্নলিখিত।

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

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

যেহেতু এর প্রাথমিক ব্যবহারের একটি ক্ষেত্রে ইউনিক্সের কোড আপ করা ছিল তাই ভাসমান বিন্দুটি অকেজো হওয়ার পাশে থাকত। বিসিপিএল, যার ভিত্তিতে সি ভিত্তিক ছিল, তার পাওয়ারেরও কোনও ব্যবহার ছিল না (স্মৃতি থেকে এটি কোনও ভাসমান পয়েন্ট ছিল না)।

অন্যদিকে, একটি অবিচ্ছেদ্য শক্তি অপারেটর সম্ভবত একটি গ্রন্থাগার কলের চেয়ে বাইনারি অপারেটর হত। আপনি লাইব্রেরির পরিবর্তে ভাষার যথাযথ অংশ সহ x = add (y, z)তবে দুটি সংখ্যক যোগ করতে পারবেন না ।x = y + z

তৃতীয়ত, যেহেতু অবিচ্ছেদ্য শক্তির প্রয়োগ অপেক্ষাকৃত তুচ্ছ, এটি প্রায় নিশ্চিত যে ভাষার বিকাশকারীরা তাদের সময়কে আরও কার্যকর জিনিস সরবরাহ করার জন্য আরও ভালভাবে ব্যবহার করবেন (সুযোগ ব্যয়ের বিষয়ে নীচের মন্তব্য দেখুন)।

এটি আসলটির জন্যও প্রাসঙ্গিক C++। যেহেতু মূল প্রয়োগটি কার্যকরভাবে একটি অনুবাদক যা Cকোড তৈরি করেছিল , এটি এর অনেকগুলি বৈশিষ্ট্যকে বহন করে C। এর আসল উদ্দেশ্যটি ছিল সি-উইথ-ক্লাস, সি-সহ-ক্লাস-প্লাস-অল্প-বিট-অফ-অতিরিক্ত-গণিত-স্টাফ নয়।

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

পরে এই স্ট্যান্ডার্ডটির পুনরাবৃত্তিগুলিরও নির্দিষ্ট নির্দেশিকা রয়েছে এবং যুক্তি সংক্রান্ত নথিতে এটি পাওয়া যাবে (কমিটি কেন ভাষাটির পক্ষে যৌক্তিক নয়, কেন নির্দিষ্ট সিদ্ধান্ত নিয়েছিল তার যুক্তি)।

উদাহরণস্বরূপ C99যৌক্তিক নথিতে বিশেষত দুটি গাইড C89নীতি ফরোয়ার্ড করা হয়েছে যা কী যুক্ত করা যায় তা সীমাবদ্ধ করে:

  • ভাষা ছোট এবং সরল রাখুন।
  • কোনও অপারেশন করার একমাত্র উপায় সরবরাহ করুন।

নির্দেশিকা (প্রয়োজনীয়ভাবে সেই নির্দিষ্টগুলি নয়) পৃথক কর্ম গ্রুপের জন্য নির্দিষ্ট করা হয়েছে এবং তাই এটি সীমাবদ্ধ করেC++ কমিটিগুলি (এবং অন্যান্য সমস্ত আইএসও গ্রুপ) ।

এছাড়াও, মান-নির্ধারণকারী সংস্থাগুলি বুঝতে পারে যে তারা যে সিদ্ধান্ত নেয় তার প্রতিটি সুযোগের জন্য একটি ব্যয় ব্যয় হয় (একটি অর্থনৈতিক শব্দ যার অর্থ আপনার কী সিদ্ধান্ত নেওয়া উচিত) to উদাহরণস্বরূপ, 10,000 ডলার উবার-গেমিং মেশিন কেনার সুযোগ ব্যয়টি আপনার প্রায় অর্ধেকের সাথে প্রায় ছয় মাসের জন্য সৌহার্দ্যপূর্ণ সম্পর্ক (বা সম্ভবত সমস্ত সম্পর্ক)।

এরিক গোনারসন তার -100 পয়েন্টের ব্যাখ্যা দিয়ে এটি ভালভাবে ব্যাখ্যা করেন করেছেন যে মাইক্রোসফ্ট পণ্যগুলিতে কেন সবসময় জিনিসগুলি যুক্ত করা হয় না - মূলত কোনও বৈশিষ্ট্যটি গর্তে 100 পয়েন্ট শুরু করে যাতে এটি বিবেচনার জন্যও বেশ কিছুটা মূল্য যোগ করতে হয়।

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

আমি হাজার হাজার এবং হাজার হাজার সংগ্রহ স্ট্যান্ডার্ড লাইব্রেরি (হ্যাশ, বিটি, লাল-কালো গাছ, অভিধান, স্বেচ্ছাসেবী মানচিত্র এবং আরও কিছু) এর পাশাপাশি দেখতে চাইছি, তবে যুক্তি অনুসারে:

একটি মান প্রয়োগকারী এবং প্রোগ্রামার মধ্যে একটি চুক্তি হয়।

এবং স্ট্যান্ডার্ড সংস্থাগুলিতে প্রয়োগকারীগুলির সংখ্যা প্রোগ্রামারগুলির সংখ্যার তুলনায় অনেক বেশি (বা কমপক্ষে এমন প্রোগ্রামার যারা সুযোগ ব্যয় বুঝতে পারে না)। তাহলে যে সব উপাদান যোগ করা হয়েছিল, পরবর্তী মান C++হতে হবে C++215xএবং সম্ভবত সম্পূর্ণরূপে কম্পাইলার ডেভেলপারদের তিনশত বছর পর বাস্তবায়ন করা হবে।

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


2
এফডাব্লুআইডাব্লু, আমি মনে করি না যে সি ++ সীমাবদ্ধতা হিসাবে "একটি অপারেশন করার একমাত্র উপায় সরবরাহ করুন" অনুসরণ করে। ঠিক তাই, কারণ উদাহরণস্বরূপ to_stringএবং ল্যাম্বডাস দুটোই এমন কাজের জন্য সুবিধা যা আপনি ইতিমধ্যে করতে পারেন। আমি মনে করি যে এই দু'জনকেই অনুমতি দেওয়ার জন্য খুব সহজেই "অপারেশন করার একমাত্র উপায়" ব্যাখ্যা করতে পারে এবং একই সাথে কার্যকারিতার প্রায় কোনও সদৃশকে যে ধারণা করতে পারে, "আহা! না!" বলে বলে দেয় কারণ সুবিধাটি তোলে এটি একেবারে সমতুল্য কিন্তু আরও দীর্ঘ-বায়ুযুক্ত বিকল্পের থেকে একেবারে ভিন্ন অপারেশন! "! লাম্বদাসের ক্ষেত্রে এটি অবশ্যই সত্য।
স্টিভ জেসপ

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

2
মাত্র একটি পয়েন্ট (কয়েকজনের মধ্যে): "যে কোনও কোড বানর দশ মিনিটের মধ্যে চাবুক পেতে পারে"। অবশ্যই, এবং যদি 100 কোড বানর (চমৎকার অপমানজনক শব্দ, বিটিডাব্লু) প্রতি বছর করে (সম্ভবত একটি কম অনুমান), আমাদের 1000 মিনিট নষ্ট হয়। খুব দক্ষ, আপনি কি ভাবেন না?
জার্গেন এ। এরহার্ড

1
@ জারজেন, এটি অপমানজনক বলে বোঝানো হয়নি (যেহেতু আমি আসলে নির্দিষ্ট কারও কাছে লেবেলটি স্বীকার করি নি), এটি কেবলমাত্র একটি ইঙ্গিত যা powসত্যিকারের পক্ষে খুব বেশি দক্ষতার প্রয়োজন হয় না। অবশ্যই আমি স্ট্যান্ডার্ডটি এমন কিছু সরবরাহ করলাম যার জন্য প্রচুর দক্ষতার প্রয়োজন হবে , এবং যদি প্রচেষ্টাটি নকল করতে হত তবে তার চেয়ে অনেক বেশি সময় নষ্ট হবে।
paxdiablo

2
@ এহারো 2, কেবলমাত্র "কোড বানর" দিয়ে বর্তমান পাঠ্যের "অর্ধেক শালীন কোডার" প্রতিস্থাপন করুন। আমি এটি অপমানজনক বলে মনে করি নি তবে আমি সতর্ক হওয়া এবং সত্য কথা বলতে ভাল বলে মনে করি, বর্তমান শব্দটির একই ধারণাটি পাওয়া যায়।
paxdiablo

41

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

ফাংশনটি কার্যকর করার জন্য আপনার কাছে একটি বড় পূর্ণসংখ্যার প্রকারের প্রয়োজন এবং বেশিরভাগ বড় সংখ্যক লাইব্রেরি ফাংশনটি সরবরাহ করে।


সম্পাদনা: প্রশ্নের একটি মন্তব্যে স্ট্যাটিক_আরটি লিখেছেন "বেশিরভাগ ইনপুটগুলি এটিকে উপচে ফেলেছে? এক্সপ্রেস এবং ডাবল পাওয়ের ক্ষেত্রে এটি একই, আমি কাউকে অভিযোগ করতে দেখি না।" এটি ভুল।

আসুন একপাশে ছেড়ে যাই exp, কারণ এটি বিন্দুর পাশে (যদিও এটি আসলে আমার কেসটিকে আরও শক্তিশালী করে তুলবে), এবং ফোকাস করুন double pow(double x, double y)। (X, y) জোড়ার কোন অংশের জন্য এই ফাংশনটি কিছু কার্যকর করে (যেমন কেবল ওভারফ্লো বা আন্ডারফ্লো নয়)?

আমি প্রকৃতপক্ষে কেবলমাত্র ইনপুট জোড়াগুলির একটি ছোট অংশের দিকে মনোনিবেশ করতে যাচ্ছি যার জন্য এটি powবোধগম্য, কারণ এটি আমার বক্তব্য প্রমাণ করার জন্য যথেষ্ট হবে: যদি x ইতিবাচক হয় এবং | y | <= 1, তারপরে powওভারফ্লো বা আন্ডারফ্লো হয় না। এটি সমস্ত ভাসমান-পয়েন্ট জোড়গুলির প্রায় এক-চতুর্থাংশ নিয়ে গঠিত (নন-এনএন ভাসমান-পয়েন্ট সংখ্যাগুলির ঠিক অর্ধেকটি ইতিবাচক, এবং নন-এনএএন ভাসমান-পয়েন্ট সংখ্যাগুলির অর্ধেকেরও কম সংখ্যার দৈর্ঘ্য 1 এর চেয়ে কম)। স্পষ্টতই, এখানে প্রচুর অন্যান্য ইনপুট জোড়া রয়েছে যার জন্য powকার্যকর ফলাফল পাওয়া যায় তবে আমরা নির্ধারণ করেছি যে এটি সমস্ত ইনপুটগুলির অন্তত এক-চতুর্থাংশ।

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

  • যদি 0 বা 1 এর সূচক হয় তবে কোনও বেস অর্থবোধক।
  • যদি ব্যয়কারী 2 বা ততোধিক হয় তবে 2 ^ (এন / 2) এর চেয়ে বড় কোনও বেস কোনও অর্থবহ ফলাফল দেয় না।

সুতরাং, 2 ^ (2 এন) ইনপুট জোড়াগুলির মধ্যে, 2 ^ (এন + 1) + 2 ^ (3 এন / 2) এর চেয়ে কম সংখ্যক অর্থবহ ফলাফল দেয়। যদি আমরা সর্বাধিক প্রচলিত ব্যবহার, 32-বিট পূর্ণসংখ্যার দিকে নজর দিই, এর অর্থ হ'ল এক শতাংশ ইনপুট জোড়ার 1/1000 তম ক্রমযুক্ত কিছু কেবল প্রবাহিত হয় না।


8
যাইহোক, এই সব কিছুই মোট। কারন কোনও ফাংশন কারও জন্য বৈধ নয় বা প্রচুর ইনপুট এটিকে কম দরকারী করে না।
স্ট্যাটিক_আরটি

2
@ স্ট্যাটিক_আরটি: pow(x,y)কোনও এক্স এর জন্য শূন্যের নিচে প্রবাহিত হয় না যদি | y | <= 1. ইনপুটগুলির একটি খুব সংকীর্ণ ব্যান্ড রয়েছে (বৃহত্তর x, y খুব প্রায় -1) যার জন্য আন্ডারফ্লো ঘটে তবে ফলাফলটি এখনও এই ব্যাপ্তিতে অর্থবহ।
স্টিফেন ক্যানন

2
এটিকে আরও চিন্তাভাবনা করার পরে, আমি আন্ডারফ্লোতে সম্মত। যদিও আমি এখনও মনে করি এটি প্রশ্নের সাথে প্রাসঙ্গিক নয়।
স্ট্যাটিক_আরটি

7
@ ইয়ুবাঙ্গোবিল: আপনি কেন এটি কারণ হিসাবে বেছে নেবেন? ব্যক্তিগতভাবে, আমি বিপুল সংখ্যক সমস্যা এবং প্রোগ্রামারগুলির উপযোগিতার পক্ষে চাইছি, নিখরচায় বাস্তবায়নকারীরা সম্ভবত বেশিরভাগ প্রোগ্রামার লিখতে পারবেন তার চেয়ে দ্রুততর হার্ওয়ার অনুকূলিত সংস্করণ তৈরি করার সম্ভাবনা রয়েছে। আপনার মানদণ্ডটি সম্পূর্ণ স্বেচ্ছাচারী বলে মনে হচ্ছে এবং খোলামেলা, বেশ অর্থহীন।
স্ট্যাটিক_আরটিটি

5
@ স্টেফেনকনন: উজ্জ্বল দিক থেকে আপনার যুক্তি দেখায় যে সুস্পষ্টভাবে সঠিক-এবং-সর্বোত্তম বাস্তবায়নটি powকেবল একটি ছোট্ট সন্ধানের টেবিল। :-)
আর .. গিটহাব বন্ধ করুন ICE

11

কারণ যে কোনও উপায়ে সমস্ত পূর্ণসংখ্যার শক্তিগুলি উপস্থাপন করার কোনও উপায় নেই:

>>> print 2**-4
0.0625

3
সীমাবদ্ধ আকারের সংখ্যাসূচক প্রকারের জন্য, অতিরিক্ত প্রবাহের কারণে ওই ধরণের সমস্ত ধরণের শক্তি উপস্থাপন করার উপায় নেই। তবে নেতিবাচক শক্তি সম্পর্কে আপনার বক্তব্য আরও বৈধ।
ক্রিস লুৎজ

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

3
বা পৃথক int pow(int base, unsigned int exponent)এবংfloat pow(int base, int exponent)
পঙ্কডুডল

4
একটি নেতিবাচক পূর্ণসংখ্যা পাস করার জন্য তারা এটিকে কেবল অপরিজ্ঞাত আচরণ হিসাবে ঘোষণা করতে পারে।
জোহানেস স্কাউব -

2
সমস্ত আধুনিক বাস্তবায়নে, এর বাইরে কিছু কিছু int pow(int base, unsigned char exponent)হোক না কেন কিছুটা অযথা। হয় বেস 0, বা 1, এবং সূচকটি কোনও ব্যাপার নয়, এটি -1, এক্ষেত্রে কেবলমাত্র ব্যয়কারীদের শেষ বিট, বাbase >1 || base< -1 ক্ষেত্রে অতিরিক্ত exponent<256প্রবাহের জরিমানার ক্ষেত্রে ।
এমসাল্টার্স

9

আসলে এটি একটি আকর্ষণীয় প্রশ্ন। একটি যুক্তি যা আমি আলোচনায় পাইনি তা হ'ল যুক্তিগুলির সুস্পষ্ট রিটার্ন মানগুলির সহজ অভাব। জলদি int pow_int(int, int)ফাংশন যেভাবে ব্যর্থ হতে পারে সেগুলি গণনা করি ।

  1. টলমলানি
  2. ফলাফল অপরিবর্তিত pow_int(0,0)
  3. ফলাফল উপস্থাপন করা যাবে না pow_int(2,-1)

ফাংশনে কমপক্ষে 2 ব্যর্থতা মোড রয়েছে। পূর্ণসংখ্যা এই মানগুলির প্রতিনিধিত্ব করতে পারে না, এই ক্ষেত্রে ফাংশনের আচরণটি স্ট্যান্ডার্ড দ্বারা সংজ্ঞায়িত করা দরকার - এবং প্রোগ্রামাররা ঠিক কীভাবে এই কেসগুলি পরিচালনা করে তা সম্পর্কে সচেতন হওয়া দরকার।

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


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

7

সংক্ষিপ্ত উত্তর:

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

এখন, দীর্ঘ উত্তরের জন্য।

pow(x, n)nপ্রাকৃতিক সংখ্যায় বিশেষায়িত হয়ে অনেক ক্ষেত্রে আরও দ্রুত তৈরি করা যায় । আমি লিখি প্রায় প্রতিটি প্রোগ্রামের জন্য আমাকে এই ফাংশনটির নিজস্ব প্রয়োগটি ব্যবহার করতে হয়েছিল (তবে আমি সি তে প্রচুর গাণিতিক প্রোগ্রাম লিখি)। বিশেষায়িত ক্রিয়াকলাপটি O(log(n))সময় মতো করা যায়, তবে যখন nছোট হয়, একটি সরল রৈখিক সংস্করণটি দ্রুততর হতে পারে। এখানে উভয়ের বাস্তবায়ন রয়েছে:


    // Computes x^n, where n is a natural number.
    double pown(double x, unsigned n)
    {
        double y = 1;
        // n = 2*d + r. x^n = (x^2)^d * x^r.
        unsigned d = n >> 1;
        unsigned r = n & 1;
        double x_2_d = d == 0? 1 : pown(x*x, d);
        double x_r = r == 0? 1 : x;
        return x_2_d*x_r;
    }
    // The linear implementation.
    double pown_l(double x, unsigned n)
    {
        double y = 1;
        for (unsigned i = 0; i < n; i++)
            y *= x;
        return y;
    }

(আমি ছেড়েছি xএবং দ্বিগুণ হিসাবে ফেরতের মান হ'ল কারণ ফলাফল pow(double x, unsigned n)হিসাবে প্রায়শই প্রায় দ্বিগুণ হয়ে pow(double, double)যাবে))

(হ্যাঁ, pownপুনরাবৃত্তিমূলক, তবে স্ট্যাক ভাঙা একেবারেই অসম্ভব যেহেতু সর্বাধিক স্ট্যাকের আকার মোটামুটি সমান হবে log_2(n)এবং nএটি একটি পূর্ণসংখ্যা If nযদি একটি -৪-বিট পূর্ণসংখ্যা হয় তবে এটি আপনাকে সর্বাধিক 64৪ স্ট্যাকের আকার দেয় No কোনও হার্ডওয়্যারের মতো চরম আকার নেই) মেমোরি সীমাবদ্ধতাগুলি, কেবলমাত্র 3 থেকে 8 ফাংশন গভীরভাবে কল করে এমন হার্ডওয়্যার স্ট্যাকযুক্ত কিছু ডজি পিআইসি ব্যতীত))

পারফরম্যান্সের ক্ষেত্রে, আপনি উদ্যানের বিভিন্ন ধরণের pow(double, double)কী সক্ষম তা দেখে আপনি অবাক হবেন । আমি আমার 5 বছর বয়সী আইবিএম থিঙ্কপ্যাডে xপুনরাবৃত্তি সংখ্যার nসমান এবং 10 এর সমান সহ এক মিলিয়ন পুনরাবৃত্তি পরীক্ষা করেছি this এই পরিস্থিতিতে, pown_lজিতেছি। গ্লিবসি pow()12.0 ব্যবহারকারীর সেকেন্ড সময় pownনিয়েছে, 7.4 ব্যবহারকারীর সেকেন্ড সময় pown_lনিয়েছে এবং মাত্র 6.5 ব্যবহারকারীর সেকেন্ড নিয়েছিল। সুতরাং এটি খুব অবাক হওয়ার কিছু নয়। আমরা কমবেশি এটি আশা করছিলাম।

তারপরে, আমি xস্থির থাকতে পারি (আমি এটি 2.5 এ সেট করেছি) এবং আমি n0 থেকে 19 একশ মিলিয়ন বার লুপ করেছি । এবার, বেশ অপ্রত্যাশিতভাবে, গ্লিবসি powজিতেছে, এবং একটি ভূমিধসের দ্বারা! এটি গ্রহণ করেছে মাত্র 2.0 ব্যবহারকারী সেকেন্ড। আমার pown9.6 সেকেন্ড সময় pown_lনিয়েছে এবং 12.2 সেকেন্ড সময় নিয়েছে। সেখানে কি ঘটেছিল? আমি আরও একটি পরীক্ষা করেছি।

আমি উপরের মতো একই জিনিসটি কেবল xএক মিলিয়ন এর সমান দিয়েছিলাম। এইবার, pown9.6s এ জিতেছে। pown_l12.2 সেকেন্ড নিয়েছে এবং গ্লিবসি পাও 16.3 সেকেন্ড নিয়েছে। এখন, এটা পরিষ্কার! glibc কম powযখন তিনটি তুলনায় ভাল সঞ্চালন করে x, কিন্তু যখন xউচ্চ হয় সবচেয়ে খারাপ । যখন xবেশি, pown_lসঞ্চালিত সেরা যখন nকম, এবং pownসঞ্চালিত সেরা যখন xউচ্চ।

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

double pown_auto(double x, unsigned n, double x_expected, unsigned n_expected) {
    if (x_expected < x_threshold)
        return pow(x, n);
    if (n_expected < n_threshold)
        return pown_l(x, n);
    return pown(x, n);
}

সংকলনের সময় যতক্ষণ x_expectedএবং n_expectedস্থির হিসাবে স্থির করা হয়, সম্ভবত কিছু অন্যান্য ক্যাভেটের সাথে, এর লবণের মূল্যবান অনুকূলিতকরণ সংকলক স্বয়ংক্রিয়ভাবে পুরো pown_autoফাংশন কলটি সরিয়ে ফেলবে এবং তিনটি অ্যালগরিদমের উপযুক্ত পছন্দের সাথে প্রতিস্থাপন করবে। (এখন, আপনি যদি সত্যিই এটি ব্যবহার করার চেষ্টা করছেন , আপনাকে সম্ভবত এটির সাথে কিছুটা খেলনা করতে হবে, কারণ আমি উপরে যা লিখেছি তা সংকলন করার চেষ্টা করেছি না;))

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

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

বোনাস বৃত্তাকার: একটি পূর্ণসংখ্যার আউটপুট প্রয়োজন হয় যা ঘটে, pow(x, n)সমস্ত সংখ্যার একটি বিশেষত্ব সহায়ক । পি ^ এন উপাদানগুলির সাথে একটি এন-মাত্রিক অ্যারের জন্য মেমরি বরাদ্দকরণ বিবেচনা করুন Consider এমনকি একের পর এক পি ^ এন বন্ধ রাখার ফলে সম্ভবত এলোমেলোভাবে সেগফল্ট ঘটে।


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

"কারওর এ জাতীয় চরম স্মৃতির সীমাবদ্ধতা নেই" মিথ্যা। পিআইসিতে প্রায়শই সর্বাধিক 3 (উদাহরণস্বরূপ PIC10F200) থেকে 8 টি (উদাহরণস্বরূপ 16F722A) কল সীমাবদ্ধ কল স্ট্যাক থাকে (পিআইসি ফাংশন কলগুলির জন্য একটি হার্ডওয়্যার স্ট্যাক ব্যবহার করে)।
12431234123412341234123

ওহ, মানুষ যে নির্মম লোল। ঠিক আছে, সুতরাং এটি P পিকগুলিতে কাজ করবে না।
enigmaticPhysicist

একটি পূর্ণসংখ্যার বেসের পাশাপাশি পাওয়ারের জন্য যেমন প্রশ্নটি জিজ্ঞাসা করা হয়, কম্পাইলার (জিসিসি এবং ক্ল্যাং) সহজেই পুনরাবৃত্তির (পুনরাবৃত্তির পরিবর্তে) বাস্তবায়ন থেকে একটি শাখাবিহীন লুপ তৈরি করে। এটি প্রতিটি বিট থেকে শাখা ভুলগুলি এড়িয়ে চলে nGodbolt.org/z/L9Kb98 । জিসিসি এবং ক্ল্যাং আপনার পুনরাবৃত্ত সংজ্ঞাটিকে একটি সাধারণ লুপে অনুকূলিত করতে ব্যর্থ হয়েছে এবং প্রতিটি বিটটিতে প্রকৃতপক্ষে শাখা করে n। ( pown_iter(double,unsigned)তারা এখনও শাখা করে, তবে শাখাবিহীন এসএসই 2 বা এসএসই 4.1 বাস্তবায়ন x86 অ্যাসেম বা সি ইন্টার্নিক্সের সাথে হওয়া উচিত But তবে এটি পুনরাবৃত্তির চেয়ে আরও ভাল)
পিটার কর্ডেস

ক্র্যাপ, এখন আমাকে নিশ্চিত করতে লুপ-ভিত্তিক সংস্করণটি দিয়ে আবার সমস্ত কিছু করতে হবে marks আমি এটা সম্পর্কে চিন্তা করব.
এনজিমেটিক্যাল ফিজিসিস্ট

6

C ++ অতিরিক্ত ওভারলোড না থাকার একটি কারণ সি এর সাথে সামঞ্জস্যপূর্ণ be

সি ++ 98 এর মতো ক্রিয়াকলাপ রয়েছে double pow(double, int)তবে সি 99+ এর মধ্যে সেগুলি অন্তর্ভুক্ত হয়নি এমন যুক্তি দিয়ে এগুলিকে C ++ 11 এ সরানো হয়েছে।

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3286.html#550

কিছুটা বেশি নির্ভুল ফলাফল পাওয়া মানেই কিছুটা আলাদা ফলাফল পাওয়া।


3

বিশ্ব ক্রমাগত বিকশিত হয় এবং প্রোগ্রামিং ভাষাও তাই। সি দশমিক টিআর চতুর্থ অংশ ¹ আরো কিছু ফাংশন যোগ করা <math.h>। এই ফাংশনগুলির দুটি পরিবার এই প্রশ্নের পক্ষে আগ্রহী হতে পারে:

  • pownফাংশন, একটি ফ্লোটিং পয়েন্ট সংখ্যা এবং একটি লাগে intmax_tএক্সপোনেন্ট।
  • powrফাংশন, যে দুটি ভাসমান পয়েন্ট সংখ্যা (নেয় xএবং y) এবং Compute xক্ষমতায় yসূত্র সঙ্গে exp(y*log(x))

দেখে মনে হচ্ছে মানক ছেলেরা শেষ পর্যন্ত এই বৈশিষ্ট্যগুলিকে স্ট্যান্ডার্ড লাইব্রেরিতে সংহত করার জন্য যথেষ্ট দরকারী বলে মনে করেছে। যাইহোক, যুক্তিযুক্ত হ'ল এই ফাংশনগুলি বাইনারি এবং দশমিক ভাসমান পয়েন্ট সংখ্যার জন্য আইএসও / আইইসি / আইইইই 60559: 2011 স্ট্যান্ডার্ড দ্বারা সুপারিশ করা হয় । আমি নিশ্চিতভাবে বলতে পারি না যে সি 98 এর সময় "স্ট্যান্ডার্ড" কী অনুসরণ করা হয়েছিল, তবে ভবিষ্যতের বিবর্তনগুলি <math.h>সম্ভবত আইএসও / আইইসি / আইইইই 60559 স্ট্যান্ডার্ডের ভবিষ্যত বিবর্তনের ফলে খুব বেশি প্রভাবিত হবে ।

দ্রষ্টব্য যে দশমিক টিআর এর চতুর্থ অংশটি সি 2 এক্স (পরবর্তী বড় সি পুনর্বিবেচনা) এর অন্তর্ভুক্ত হবে না এবং সম্ভবত পরে anচ্ছিক বৈশিষ্ট্য হিসাবে অন্তর্ভুক্ত করা হবে। ভবিষ্যতের সি ++ রিভিশনটিতে টিআর এর এই অংশটি অন্তর্ভুক্ত করার বিষয়ে আমার জানা কোনও উদ্দেশ্য ছিল না।


¹ আপনি এখানে কিছু কার্য-অগ্রগতি ডকুমেন্টেশন সন্ধান করতে পারেন ।


এমন কোনও কলুষিত বাস্তবায়ন রয়েছে যেখানে কোনও কাঙ্ক্ষিত ব্যক্তির pownসাথে ব্যবহার করার চেয়ে LONG_MAXকখনও ব্যবহারের LONG_MAXচেয়ে LONG_MINআলাদা মূল্য পাওয়া উচিত , বা যেখানে এর চেয়ে কম মান আলাদা হওয়া উচিত LONG_MIN? আমি আশ্চর্য হয়েছি যে intmax_tকোনও ক্ষয়কারীকে ব্যবহার করে কী সুবিধা পাওয়া যায় ?
সুপারক্যাট

@ সুপের্যাট কোন ধারণা নেই, দুঃখিত।
মরওয়েন

এটি উল্লেখ করার উপযুক্ত হতে পারে যে, স্ট্যান্ডার্ডটির দিকে তাকালে এটি একটি alচ্ছিক "ক্রপাউন" ফাংশনটি সংজ্ঞায়িতও করে বলে মনে হয়, এটি যদি সংজ্ঞায়িত করা হয় তবে এটি "পংকের" সঠিকভাবে গোলাকার সংস্করণ হবে; স্ট্যান্ডার্ড অন্যথায় সঠিকতার প্রয়োজনীয় ডিগ্রি নির্দিষ্ট করে না। একটি দ্রুত এবং পরিমিতরূপে-নির্ভুল "পোঁদ" প্রয়োগ করা সহজ, তবে সমস্ত ক্ষেত্রে সঠিক বৃত্তাকারীকরণ নিশ্চিত করা আরও বেশি ব্যয়বহুল হতে উপযুক্ত।
সুপারক্যাট

2

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

(এক কিছুর জন্য, লগারিদমগুলি গুণকে গুণাগুণ হ্রাস করে, তবে বেশিরভাগ ইনপুটগুলির জন্য পূর্ণসংখ্যার লোগারিথগুলি অনেক নির্ভুলতা হারাতে পারে)

স্টিফেন ঠিক বলেছেন যে আধুনিক প্রসেসরগুলিতে এটি আর সত্য নয়, তবে সি স্ট্যান্ডার্ড যখন গণিতের ফাংশনগুলি নির্বাচন করা হত (সি ++ কেবলমাত্র সি ফাংশন ব্যবহার করা হয়েছিল) এখন কি, 20 বছর বয়সী?


5
আমি কোনও এফপিইউ নির্দেশনা সহ কোনও বর্তমান স্থাপত্য সম্পর্কে জানি না pow। x86 এর একটি y log2 xনির্দেশ রয়েছে ( fyl2x) যা কোনও powফাংশনের প্রথম অংশ হিসাবে ব্যবহার করা যেতে পারে , তবে powসেই পদ্ধতিতে লেখা একটি ফাংশন বর্তমান হার্ডওয়্যারটিতে চালিত হতে কয়েকশ চক্র গ্রহণ করে; একটি ভাল লিখিত পূর্ণসংখ্যার ক্ষয়ক্ষতি রুটিন কয়েক গুণ দ্রুত হয়।
স্টিফেন ক্যানন

আমি জানি না যে "শত" সঠিক, এটি বেশিরভাগ আধুনিক সিপিইউতে f2xm1 এর পরে fyl2x এর জন্য প্রায় 150 টি চক্র বলে মনে হয় এবং এটি অন্যান্য নির্দেশাবলীর সাথে পাইপলাইনযুক্ত হয়। তবে আপনি ঠিক বলেছেন যে একটি সুসংগঠিত পূর্ণসংখ্যার বাস্তবায়ন খুব দ্রুত হওয়া উচিত (এই দিনগুলিতে) যেহেতু আইএমএলটি ভাসমান-পয়েন্ট নির্দেশিকাগুলির চেয়ে অনেক বেশি বাড়িয়েছে। ফিরে যখন সি স্ট্যান্ডার্ডটি লেখা হয়েছিল, যদিও, আইএমএল বেশ ব্যয়বহুল ছিল এবং এটি একটি লুপে ব্যবহার করা সম্ভবত এফপিইউ ব্যবহারের চেয়ে বেশি সময় নেয়।
বেন ভয়েগট

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

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

1

এখানে পাও () (লগ (এন)) এর কার্যকর একটি বাস্তবায়ন যা পূর্ণসংখ্যা সহ যে কোনও সংখ্যাসূচক প্রকারের জন্য কাজ করে :

template<typename T>
static constexpr inline T pown(T x, unsigned p) {
    T result = 1;

    while (p) {
        if (p & 0x1) {
            result *= x;
        }
        x *= x;
        p >>= 1;
    }

    return result;
}

এটি এনজিমেটিক ফিজিসিস্টের ও (লগ (এন)) প্রয়োগের চেয়ে ভাল কারণ এটি পুনরাবৃত্তি ব্যবহার করে না।

এটি তার রৈখিক বাস্তবায়নের চেয়ে প্রায় সবসময় দ্রুত (যতক্ষণ p> ~ 3 থাকে) কারণ:

  • এটি কোনও অতিরিক্ত মেমরির প্রয়োজন হয় না
  • এটি প্রতি লুপে ~ 1.5x আরও বেশি কাজ করে
  • এটি প্রতি লুপে ~ 1.25x আরও মেমরি আপডেট করে

-2

বাস্তবে বিষয়টি তা করে।

যেহেতু সি ++ ১১ এর pow(int, int)--- এবং আরও সাধারণ ক্ষেত্রে এর একটি তাত্পর্যপূর্ণ বাস্তবায়ন রয়েছে , http://en.cppreferences.com/w/cpp/numeric/math/pow এ (7) দেখুন


সম্পাদনা: বিশোধবাদীরা তর্ক করতে পারে এটি সঠিক নয়, কারণ সেখানে প্রকৃতপক্ষে "প্রচারিত" টাইপিং ব্যবহৃত হয়েছে। এক বা অন্য উপায় int, intপ্যারামিটারগুলিতে একটি সঠিক ফলাফল বা ত্রুটি পায় ।


2
এটি ভুল। (7) ওভারলোডটি pow ( Arithmetic1 base, Arithmetic2 exp )যা কাস্ট করা হবে doubleবা long doubleযদি আপনি বিবরণটি পড়ে থাকেন: ")) গাণিতিক ধরণের সমস্ত আর্গুমেন্টের জন্য ওভারলোডের একটি সেট বা ফাংশন টেম্পলেট 1-3 দ্বারা আবৃত নয়) যদি কোনও যুক্তি থাকে তবে অবিচ্ছেদ্য প্রকার রয়েছে, এটি দ্বিগুণ হয়ে গেছে any যদি কোনও যুক্তি দীর্ঘ দ্বিগুণ হয় তবে প্রবর্তিত প্রকারের প্রচারটিও দীর্ঘ দ্বিগুণ হয়, অন্যথায় রিটার্নের ধরণটি সর্বদা দ্বিগুণ। "
ফুক্লভ

এখানে ভুল কি? আমি নিছক বলেন যে আজকাল (যেহেতু সি ++ 11) একটি টেমপ্লেট করা Pow ( , ) মান গ্রন্থাগার, যা 2010 ক্ষেত্রে ছিল না হয়
দিমা Pasechnik

5
না এটা না। মন্দিরগুলি এই জাতীয়গুলি ডাবল বা দীর্ঘ ডাবল হিসাবে প্রচার করে। সুতরাং এটি নীচে ডাবলস উপর কাজ করে।
ত্রিসমেজিস্টোস

1
@ ট্রাইসমেজিস্টস এটি এখনও ইন প্যারামিটারগুলিকে অনুমতি দেয়। যদি এই টেমপ্লেটটি না থাকত তবে পরামিতিগুলির প্যারামিটারগুলি পাস করার ফলে ইন্টের বিটগুলিকে একটি ভাসমান হিসাবে ব্যাখ্যা করে, যার ফলে স্বেচ্ছাসেবী অপ্রত্যাশিত ফলাফল ঘটে। মিশ্র ইনপুট মানগুলির ক্ষেত্রেও একই ঘটনা ঘটে। যেমন pow(1.5f, 3)= 1072693280তবে pow(1.5f, float(3))=3.375
মার্ক জেরোনিমাস

2
ওপিতে অনুরোধ করা হয়েছিল int pow(int, int), তবে সি ++ 11 কেবল সরবরাহ করে double pow(int, int)। @ ফুকলভের ব্যাখ্যা দেখুন।
xuhdev

-4

খুব সাধারণ কারণ:

5^-2 = 1/25

এসটিএল লাইব্রেরির সমস্ত কিছুই সুনির্দিষ্ট, দৃ rob় স্টাফের উপর ভিত্তি করে কল্পনাযোগ্য। অবশ্যই, কোনটি শূন্যে ফিরে আসবে (1/25 থেকে) তবে এটি একটি ভুল উত্তর হবে।

আমি একমত, এটি কিছু ক্ষেত্রে অদ্ভুত।


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