ฟังก์ชั่น C ++ เพื่อเพิ่มจำนวนให้เป็นเลขกำลังคืออะไร?


132

ฉันจะเพิ่มจำนวนให้เป็นพลังได้อย่างไร

2^1

2^2

2^3

ฯลฯ ...


ชื่อเรื่องทำให้เข้าใจผิด นี่เป็นเรื่องของพลังโดยทั่วไปไม่ใช่แค่กำลังสอง ฉันแก้ไขและแก้ไขแล้ว
Zifre

31
ถ้าเป็นเรื่องของพลัง 2 โดยทั่วไปให้ใช้ <<
Thomas L Holaday

1
ใช่ว่าจะทำงานให้จำนวนเต็ม . .
imallett

3
โดยเฉพาะจำนวนเต็มของโดเมน จำกัด แม้เพียงแค่ 2 ^ 70 ก็จะล้นจำนวนเต็ม (แต่โฟลทสามารถแทนค่าได้อย่างแม่นยำ )
Ponkadoodle

คำตอบ:



96

std::powใน<cmath>ส่วนหัวมีโอเวอร์โหลดเหล่านี้:

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)

กับ N เป็น int เพราะไม่ทราบว่าของfloat, doubleหรือlong doubleรุ่นที่มันควรจะใช้เวลาและคุณจะได้รับข้อผิดพลาดคลุมเครือ ทั้งสามจะต้องมีการแปลงจาก int เป็นทศนิยมและทั้งสามมีค่าใช้จ่ายเท่ากัน!

ดังนั้นอย่าลืมพิมพ์อาร์กิวเมนต์แรกเพื่อให้ตรงกับหนึ่งในสามข้อนี้อย่างสมบูรณ์แบบ ฉันมักจะใช้double

pow(2.0, N)

ทนายความบางคนอึจากฉันอีกครั้ง ฉันมักจะตกหลุมพรางนี้ด้วยตัวเองดังนั้นฉันจะเตือนคุณเกี่ยวกับเรื่องนี้


int N; pow(2.0, N)ยังคงคลุมเครือ: could be 'pow(double,int)' or 'pow(double,double)'- / →นักแสดง
Marvin

3
ฉันขอแนะนำให้อ่านความคิดเห็นของฉันก่อนที่จะเพิ่มความคิดเห็น ;-) ฉันอธิบายว่ามันให้ความคลุมเครือ (ผู้รวบรวม VS2008)
มาวิน

1
@Marvin: Visual C ++ 2010 Express ไม่มีปัญหากับstd::pow(2.0, 3).
Keith Thompson

5
@ มาร์วินตั้งแต่ฉันหยิ่งผยองขึ้นเรื่อย ๆ ฉันจะตอบกลับอีกครั้ง: คุณไม่ได้พูดว่า "... ถูกคอมไพเลอร์ปฏิเสธว่าคลุมเครือ ... " แต่คุณบอกว่า "... ยังคงคลุมเครือ : ... "ซึ่งคุณไม่ได้สำรองข้อมูล การบอกใบ้ถึงพฤติกรรมของคอมไพเลอร์อาจเป็นการสำรองข้อมูล แต่ถ้าฉันแสดงให้เห็นว่าเป็นอิสระจากคอมไพเลอร์จากหลักการแรก (ข้อมูลจำเพาะเอง) ว่าสิ่งนี้ไม่คลุมเครือฉันก็มีพื้นฐานที่สูงกว่า อนิจจาคอมไพเลอร์ C ++ อาจมีจุดบกพร่อง
Johannes Schaub - litb

1
ฉันคิดว่าpow(2, N)มันไม่ชัดเจนตั้งแต่ C ++ 11 เนื่องจากมีฟังก์ชันเทมเพลตที่รับประเภทเลขคณิตเป็นพารามิเตอร์
Ale

28

ใน C ++ ตัวดำเนินการ "^" เป็นบิตหรือ มันไม่ได้ผลสำหรับการเพิ่มพลัง x << n คือการเลื่อนไปทางซ้ายของเลขฐานสองซึ่งเหมือนกับการคูณ x ด้วยจำนวนครั้ง 2 n และสามารถใช้ได้ก็ต่อเมื่อเพิ่ม 2 เป็นเลขยกกำลัง ฟังก์ชัน POW เป็นฟังก์ชันทางคณิตศาสตร์ที่จะทำงานโดยทั่วไป


2
โดยเฉพาะ1 << nเป็นเช่นเดียวกับการเพิ่ม 2 n 2^nอำนาจหรือ
Ashish Ahuja

1
สำหรับใครที่ไม่เข้าใจว่าทำไม "1" ใน1 << nความคิดเห็นของ @AshishAhuja เป็นเพราะซีรีส์เป็นแบบนี้ 1 << 0 = 1ตั้งแต่2^0 = 1นั้นมา 1 << 1 = 2ตั้งแต่2^1 = 2; 1 << 2 = 4ตั้งแต่2^2 = 4 นั้นเป็นต้นไป ...
JS5

16

คุณควรจะใช้วิธี C ปกติในคณิตศาสตร์ได้

#include <cmath>

pow(2,3)

หากคุณใช้ระบบที่เหมือนยูนิกซ์ man cmath

นั่นคือสิ่งที่คุณถาม?

Sujal



13

แม้ว่าpow( base, exp )จะเป็นคำแนะนำที่ดี แต่โปรดทราบว่าโดยทั่วไปแล้วจะทำงานแบบทศนิยม

สิ่งนี้อาจใช่หรือไม่ใช่สิ่งที่คุณต้องการ: ในบางระบบการวนซ้ำแบบธรรมดาบนตัวสะสมจะเร็วกว่าสำหรับประเภทจำนวนเต็ม

และสำหรับกำลังสองโดยเฉพาะคุณอาจคูณตัวเลขเข้าด้วยกันด้วยตัวเองทศนิยมหรือจำนวนเต็ม ไม่ใช่การลดความสามารถในการอ่าน (IMHO) และคุณหลีกเลี่ยงค่าใช้จ่ายด้านประสิทธิภาพของการเรียกใช้ฟังก์ชัน


และใช่สิ่งนี้อาจอยู่ในหมวดหมู่ "การเพิ่มประสิทธิภาพก่อนเวลาอันควร" แต่ฉันพบว่ามันเป็นเรื่องดีที่จะตระหนักถึงสิ่งต่างๆเช่นนี้โดยเฉพาะอย่างยิ่งหากคุณต้องตั้งโปรแกรมในสภาพแวดล้อมที่มีทรัพยากร จำกัด
เอนกาย

11

ฉันไม่มีชื่อเสียงมากพอที่จะแสดงความคิดเห็น แต่ถ้าคุณชอบทำงานกับ QT พวกเขาก็มีเวอร์ชั่นของตัวเอง

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

หรือถ้าคุณไม่ได้ใช้ QT 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);
}

// นิยามของฟังก์ชัน RaiseToPower

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 เลิกใช้แล้วไฟล์ส่วนหัวที่ไม่ใช่มาตรฐานอย่าใช้มัน
HaseeB Mir

7

ถ้าคุณต้องการที่จะจัดการกับbase_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>

ไม่มีตัวดำเนินการ infix พิเศษเช่นใน Visual Basic หรือ Python


2
powf () เป็นฟังก์ชัน C99 ที่ไม่ได้อยู่ใน C ++
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*xครั้งปีตามที่แสดงและการตอบที่นี่https://stackoverflow.com/a/2940800/319728

x*x*xดังนั้นถ้าคุณกำลังจะสำหรับการใช้งานอย่างมีประสิทธิภาพ



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;
}


1

ใช้ฟังก์ชัน pow () ในไลบรารี cmath, tgmath หรือ math.h

#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;
}

โปรดทราบว่าหากคุณให้ input to power เป็นข้อมูลประเภทอื่นที่ไม่ใช่ long double คำตอบจะเลื่อนไปเป็น double นั่นคือจะรับอินพุตและให้เอาต์พุตเป็นสองเท่า สำหรับอินพุตคู่แบบยาวประเภทการส่งคืนคือ long double สำหรับการเปลี่ยนคำตอบเป็น int use, int c = (int) pow (a, b)

แต่โปรดทราบว่าสำหรับตัวเลขบางตัวอาจส่งผลให้ตัวเลขน้อยกว่าคำตอบที่ถูกต้อง ตัวอย่างเช่นคุณต้องคำนวณ 5 ^ 2 จากนั้นคำตอบสามารถส่งกลับเป็น 24.99999999999 ในคอมไพเลอร์บางตัว ในการเปลี่ยนชนิดข้อมูลเป็น int คำตอบจะเป็น 24 แทนที่จะเป็น 25 คำตอบที่ถูกต้อง ทำเช่นนี้

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

ตอนนี้คำตอบของคุณจะถูกต้อง นอกจากนี้สำหรับข้อมูลตัวเลขที่มีขนาดใหญ่มากจะสูญหายไปในการเปลี่ยนประเภทข้อมูล double เป็น long int ตัวอย่างเช่นคุณเขียน

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

และให้อินพุต a = 3 และ b = 38 ผลลัพธ์จะออกมาเป็น 1350851717672992000 ในขณะที่คำตอบที่ถูกต้องคือ 1350851717672992089 ซึ่งเกิดขึ้นเนื่องจากฟังก์ชัน pow () ส่งคืน 1.35085e + 18 ซึ่งได้รับการเลื่อนขั้นเป็น int เป็น 1350851717672992000 ฉันแนะนำให้เขียน a ฟังก์ชั่นพลังงานที่กำหนดเองสำหรับสถานการณ์ดังกล่าวเช่น: -

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;
}

สำหรับตัวเลขที่มากกว่าช่วง long long int ให้ใช้ boost library หรือ strings


1
ชื่อที่__มีสงวนไว้คุณควรเลือกอย่างอื่น
HolyBlackCat
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.