একটি পাওয়ারে একটি সংখ্যা বাড়াতে সি ++ ফাংশন কী?


132

আমি কীভাবে একটি শক্তিতে একটি সংখ্যা বাড়াতে পারি?

2^1

2^2

2^3

ইত্যাদি ...


শিরোনামটি বিভ্রান্তিকর ছিল। এটি সাধারণভাবে ক্ষমতা সম্পর্কে, কেবল স্কোয়ারিং নয়। আমি এটি সম্পাদনা করে ঠিক করেছি।
জিফ্রে

30
যদি এটি সাধারণভাবে 2 এর ক্ষমতা সম্পর্কে হয় তবে << ব্যবহার করুন।
টমাস এল হলাদে

1
হ্যাঁ, এটি পূর্ণসংখ্যার জন্য কাজ করবে । । ।
imallett

3
বিশেষত, একটি সীমিত ডোমেনটির পূর্ণসংখ্যা । এমনকি মাত্র 2 ^ 70 একটি পূর্ণসংখ্যার উপচে পড়বে (তবে একটি ফ্লোট তা সুনির্দিষ্টভাবে উপস্থাপন করতে পারে )
পোনকডুডল

উত্তর:



96

std::powমধ্যে <cmath>হেডার এই overloads আছে:

pow(float, float);
pow(float, int);
pow(double, double); // taken over from C
pow(double, int);
pow(long double, long double);
pow(long double, int);

এখন আপনি ঠিক করতে পারবেন না

pow(2, N)

এন, কোন int হচ্ছে কারণ এটি যার জানে না সঙ্গে float, doubleঅথবা long doubleসংস্করণ তা গ্রহণ করা উচিত, এবং আপনি একটি দ্ব্যর্থতা ত্রুটি পেতে হবে। তিনটিরই ইন্টি থেকে ফ্লোটিং পয়েন্টে রূপান্তর প্রয়োজন, এবং তিনটিই সমান ব্যয়বহুল!

সুতরাং, প্রথম যুক্তিটি টাইপ করেছেন তা নিশ্চিত হন যাতে এটি তিনটির মধ্যে একটির সাথে পুরোপুরি মেলে। আমি সাধারণত ব্যবহার করিdouble

pow(2.0, N)

কিছু উকিল আবার আমার কাছ থেকে বোকা। আমি প্রায়শই এই সমস্যার মধ্যে পড়ে যাই, তাই আমি আপনাকে এটি সম্পর্কে সতর্ক করতে যাচ্ছি।


int N; pow(2.0, N)তবুও অস্পষ্ট হবে could be 'pow(double,int)' or 'pow(double,double)':: - / → কাস্ট
মারভিন

3
আমি মন্তব্য যুক্ত করার আগে আমার মন্তব্য পড়ার পরামর্শ দিই। ;-) আমি ব্যাখ্যা করেছিলাম যে এটি একটি অস্পষ্টতা দেয়। (ভিএস ২০০৮ এর সংকলক)
মার্ভিন

1
@ মারভিন: ভিজ্যুয়াল সি ++ ২০১০ এক্সপ্রেসে কোনও সমস্যা নেই std::pow(2.0, 3)
কিথ থম্পসন

5
@Marvin যেহেতু আমি আরো অহংকারী সময়ের সাথে জন্মায় করেছি, আমি আবার উত্তর দিতে যাচ্ছি: আপনি হয়নি না বলে "... কম্পাইলার দ্বারা দ্ব্যর্থক যেমন প্রত্যাখ্যাত হয় ..." কিন্তু তুমি বলেছিলে "... হবে এখনও দ্ব্যর্থক হতে : ... ", যার জন্য আপনি কোনও ব্যাক-আপ প্রদান করেন নি। সংকলক আচরণের প্রতি ইঙ্গিত দেওয়া একটি ব্যাকআপ হতে পারে, তবে আমি প্রথম নীতিগুলি (স্পেস নিজেই) থেকে সংকলকদের থেকে স্বাধীনভাবে দেখিয়েছি যে এটি অস্পষ্ট নয়, আমি উচ্চতর জায়গা পেয়েছি। হায়রে, সি ++ সংকলকগুলিতে বাগ থাকতে পারে।
জোহানেস স্কাউব -

1
আমি pow(2, N)সি ++ 11 সাল থেকে এটিও দ্ব্যর্থহীন বলে মনে করি কারণ প্যারামিটার হিসাবে কোনও গাণিতিক প্রকার প্রাপ্ত একটি টেম্পলেট রয়েছে।
আলে

28

সি ++ এ "^" অপারেটরটি কিছুটা দিকের OR হয়। এটি একটি শক্তি উত্থাপন জন্য কাজ করে না। X << n হ'ল বাইনারি সংখ্যার একটি বাম শিফট যা 2 এন দ্বারা বহুগুণ x এর সমান এবং এটি কেবল 2 পাওয়ার বাড়ানোর সময় ব্যবহার করা যেতে পারে। POW ফাংশনটি একটি গণিতের ফাংশন যা উদারভাবে কাজ করবে।


2
বিশেষত, 1 << n2 পাওয়ার পাওয়ার, বা বাড়ানোর সমান 2^n
আশিস আহুজা

1
1 << n@ আশিষ আউজা মন্তব্যে যারা "1" কেন পায় নি তাদের পক্ষে , কারণ সিরিজটি এর আগে 1 << 0 = 1থেকে এভাবে চলেছে 2^0 = 1; 1 << 1 = 2যেহেতু 2^1 = 2; 1 << 2 = 4যেহেতু 2^2 = 4 এবং আরও ...
জেএস

16

আপনি গণিতে সাধারণ সি পদ্ধতি ব্যবহার করতে সক্ষম হবেন।

#include <cmath>

pow(2,3)

আপনি যদি ইউনিক্সের মতো সিস্টেমে থাকেন তবে man cmath

তুমি কি তাই জিজ্ঞাসা করছ?

Sujal



13

যদিও pow( base, exp )দুর্দান্ত পরামর্শ, সচেতন হন যে এটি সাধারণত ভাসমান-পয়েন্টে কাজ করে।

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

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


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

11

মন্তব্য করার মতো যথেষ্ট খ্যাতি আমার নেই, তবে আপনি যদি কিউটি দিয়ে কাজ করতে চান তবে তাদের নিজস্ব সংস্করণ রয়েছে।

    #include <QtCore/qmath.h>
    qPow(x, y); // returns x raised to the y power.

অথবা আপনি কিউটি ব্যবহার করছেন না, cmath মূলত একই জিনিস আছে।

    #include <cmath>
    double x = 5, y = 7; //As an example, 5 ^ 7 = 78125
    pow(x, y); //Should return this: 78125

7
#include <iostream>
#include <conio.h>

using namespace std;

double raiseToPow(double ,int) //raiseToPow variable of type double which takes arguments (double, int)

void main()
{
    double x; //initializing the variable x and i 
    int i;
    cout<<"please enter the number"; 
    cin>>x;
    cout<<"plese enter the integer power that you want this number raised to";
    cin>>i;
    cout<<x<<"raise to power"<<i<<"is equal to"<<raiseToPow(x,i);
}

// ফাংশন উত্থাপিত শক্তি সংজ্ঞা

double raiseToPow(double x, int power)
{
    double result;
    int i;
    result =1.0;
    for (i=1, i<=power;i++)
    {
        result = result*x;
    }
    return(result);
}

2
আপনার উত্তরে আপনার কোডের ব্যাখ্যা এবং এটি কীভাবে সমস্যার সমাধান করে তার একটি বিবরণ থাকতে হবে।
AbcAeffchen

conio.h অবচিত হয়েছে অ মানক শিরোনাম ফাইলটি ব্যবহার করবেন না।
হাসিব মীর

7

আপনি যদি বেস 2 দিয়েই ডিল করতে চান তবে আমি গণিত লাইব্রেরির পরিবর্তে বাম শিফট অপারেটর << ব্যবহার করার পরামর্শ দিচ্ছি

কোডের উদাহরণ :

int exp = 16;
for(int base_2 = 1; base_2 < (1 << exp); (base_2 <<= 1)){
std::cout << base_2 << std::endl;
}

নমুনা আউটপুট:

1   2   4   8   16  32  64  128  256  512  1024  2048  4096  8192  16384  32768

6

এটি পাউ বা ইন <math.h>

ভিজ্যুয়াল বেসিক বা পাইথনের মতো কোনও বিশেষ ইনফিক্স অপারেটর নেই


2
Powf () একটি C99 ফাংশন যা সি ++ এ নেই।
newacct

6

অনেক উত্তর প্রস্তাবিত pow()বা অনুরূপ বিকল্প বা তাদের নিজস্ব বাস্তবায়ন করেছে। যাইহোক, উদাহরণ (প্রদত্ত 2^1, 2^2এবং 2^3আপনার প্রশ্নের মধ্যে), আমি অনুমান কিনা আপনি শুধুমাত্র বাড়াতে প্রয়োজন 2একটি পূর্ণসংখ্যা ক্ষমতায়। এই যদি হয় তাহলে, আমি তোমাকে ব্যবহার করতে সুপারিশ করবে 1 << nজন্য 2^n


5
pow(2.0,1.0)
pow(2.0,2.0)
pow(2.0,3.0)

আপনার মূল প্রশ্নের শিরোনাম বিভ্রান্তিকর। কেবল স্কোয়ারে , ব্যবহার করুন 2*2


4

লক্ষ্য করুন ব্যবহারের pow(x,y)চেয়ে কম কার্যকরী x*x*xY গুন বেশি দেখানো এবং উত্তর এখানে দেওয়া https://stackoverflow.com/a/2940800/319728

আপনি যদি দক্ষতা ব্যবহারের জন্য যান x*x*x


2
int power (int i, int ow) // works only for ow >= 1
{ // but does not require <cmath> library!=)
    if (ow > 1)
    {
         i = i * power (i, ow - 1);
    }
    return i;
}

cout << power(6,7); //you can enter variables here

2

আমি গ্রন্থাগারটি ব্যবহার করছি cmathবা ক্ষমতার যত্ন নেওয়ার জন্য গ্রন্থাগারের ফাংশনগুলি math.hব্যবহার করার জন্য করছিpow()

#include<iostream>
#include<cmath>

int main()
{
    double number,power, result;
    cout<<"\nEnter the number to raise to power: ";
    cin>>number;
    cout<<"\nEnter the power to raise to: ";
    cin>>power;

    result = pow(number,power);

    cout<<"\n"<< number <<"^"<< power<<" = "<< result;

    return 0;
}

2

প্রথমে যুক্ত করুন #include <cmath>তারপর আপনি powআপনার কোডে মিথোড ব্যবহার করতে পারেন উদাহরণস্বরূপ:

pow(3.5, 3);

কোনটি 3.5 হয় বেস এবং 3 হয় মেপুঃ


1

cmath, tgmath বা math.h লাইব্রেরিতে Pow () ফাংশন ব্যবহার করুন।

#include <iostream>
#include <cmath>
using namespace std;

int main()
{
int a,b;
cin >> a >> b;
cout << pow(a,b) << endl; // this calculates a^b

return 0;
}

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

তবে, কয়েকটি সংখ্যার জন্য মনে রাখবেন এর ফলাফলটি সঠিক উত্তরের চেয়ে কম সংখ্যক হতে পারে। সুতরাং উদাহরণস্বরূপ আপনাকে 5 ^ 2 গণনা করতে হবে, তারপরে উত্তরটি কয়েকটি সংকলকগুলিতে 24.99999999999 হিসাবে ফিরে আসতে পারে। ডাটা টাইপটি ইনট-তে পরিবর্তন করে উত্তরটি 25 এর পরিবর্তে 24 হবে answer সুতরাং, এটি করুন

int c=(int)(pow(a,b)+0.5)

এখন, আপনার উত্তরটি সঠিক হবে। এছাড়াও, খুব বড় সংখ্যার জন্য ডেটা ডাবল থেকে দীর্ঘ দীর্ঘ অন্তর্গত পরিবর্তনগুলিতে হারিয়ে যায়। উদাহরণস্বরূপ আপনি লিখুন

long long int c=(long long int)(pow(a,b)+0.5);

এবং ইনপুট একটি = 3 এবং বি = 38 দিন তবে ফলাফলটি 1350851717672992000 এ আসবে যখন সঠিক উত্তরটি হবে 1350851717672992089, এটি ঘটে কারণ পাও () ফাংশনটি 1.35085e + 18 যা 1350851717672992000 হিসাবে ইন্টিতে উন্নীত হয়। আমি একটি লেখার পরামর্শ দিই এই জাতীয় পরিস্থিতিতে যেমন কাস্টম শক্তি ফাংশন: -

long long int __pow (long long int a, long long int b)
{
long long int q=1;
for (long long int i=0;i<=b-1;i++)
{
q=q*a;
}

return q;
}

এবং তারপরে যখনই আপনি চান এটি কল করুন,

int main()
{
long long int a,b;
cin >> a >> b;

long long int c=__pow(a,b);
cout << c << endl;

return 0;
}

দীর্ঘ দীর্ঘ অন্তরের পরিসরের চেয়ে বেশি সংখ্যার জন্য, হয় বুস্ট লাইব্রেরি বা স্ট্রিং ব্যবহার করুন।


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