Hàm C ++ để nâng số lên thành số là gì?


132

Làm thế nào để tôi nâng một con số lên một sức mạnh?

2^1

2^2

2^3

Vân vân...


Tiêu đề đã gây hiểu nhầm. Đây là về sức mạnh nói chung, không chỉ bình phương. Tôi đã chỉnh sửa nó và sửa nó.
Zifre

30
Nếu đó là về sức mạnh của 2 nói chung, hãy sử dụng <<.
Thomas L Holaday

1
Vâng, điều đó sẽ làm việc cho số nguyên . . .
imallett

3
Cụ thể, số nguyên của một miền hạn chế . Thậm chí chỉ 2 ^ 70 sẽ tràn qua một số nguyên (nhưng một số float có thể biểu thị chính xác )
Ponkadoodle

Câu trả lời:


146

pow () trong thư viện cmath. Thêm thông tin ở đây . Đừng quên đặt #include<cmath>ở đầu tập tin.


96

std::powtrong <cmath>tiêu đề có những quá tải này:

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

Bây giờ bạn không thể làm

pow(2, N)

với N là một int, bởi vì nó không biết được của float, doublehoặc long doublephiên bản nó sẽ mất, và bạn sẽ nhận được một lỗi mơ hồ. Cả ba đều cần chuyển đổi từ int sang dấu phẩy động và cả ba đều tốn kém như nhau!

Do đó, hãy chắc chắn có đối số đầu tiên được gõ để nó khớp với một trong ba đối số đó một cách hoàn hảo. Tôi thường sử dụngdouble

pow(2.0, N)

Một số luật sư tào lao từ tôi một lần nữa. Bản thân tôi thường rơi vào cạm bẫy này, vì vậy tôi sẽ cảnh báo bạn về điều đó.


int N; pow(2.0, N)vẫn sẽ mơ hồ :: could be 'pow(double,int)' or 'pow(double,double)'- / → diễn viên
Marvin

3
Tôi khuyên bạn nên đọc bình luận của tôi trước khi thêm một bình luận. ;-) Tôi đã giải thích rằng nó KHÔNG cho một sự mơ hồ. (Trình biên dịch của VS2008)
Marvin

1
@Marvin: Visual C ++ 2010 Express không có vấn đề gì với std::pow(2.0, 3).
Keith Thompson

5
@Marvin kể từ khi tôi trở nên kiêu ngạo hơn theo thời gian, tôi sẽ trả lời một lần nữa: Bạn không nói "... bị từ chối bởi trình biên dịch ..." nhưng bạn nói "... vẫn sẽ mơ hồ : ... ", Mà bạn không cung cấp sao lưu. Gợi ý về hành vi của trình biên dịch có thể là một bản sao lưu, nhưng nếu tôi đã thể hiện độc lập với các trình biên dịch từ các nguyên tắc đầu tiên (bản thân thông số kỹ thuật) rằng điều này không mơ hồ, thì tôi đã hiểu rõ hơn. Than ôi, trình biên dịch C ++ có thể có lỗi.
Julian Schaub - litb

1
Tôi nghĩ rằng điều đó cũng pow(2, N)không rõ ràng kể từ C ++ 11, bởi vì có một hàm mẫu nhận bất kỳ loại số học nào làm tham số.
Ale

28

Trong C ++, toán tử "^" là bit OR. Nó không hoạt động để nâng lên một sức mạnh. X << n là một dịch chuyển trái của số nhị phân giống như nhân x với 2 n số lần và chỉ có thể được sử dụng khi tăng 2 lên công suất. Hàm POW là một hàm toán học sẽ hoạt động tổng quát.


2
Cụ thể, 1 << ncũng giống như nâng 2 lên lũy thừa n, hoặc 2^n.
Ashish Ahuja

1
Đối với những người không hiểu lý do tại sao "1" trong 1 << nbình luận @AshishAhuja, đó là vì loạt phim như thế này 1 << 0 = 1kể từ đó 2^0 = 1; 1 << 1 = 2kể từ đó 2^1 = 2; 1 << 2 = 4kể từ đó 2^2 = 4 và như vậy ...
JS5

16

Bạn sẽ có thể sử dụng các phương pháp C bình thường trong toán học.

#include <cmath>

pow(2,3)

nếu bạn đang ở trên một hệ thống giống như unix, man cmath

Có phải đó là những gì bạn đang hỏi?

Sujal



13

Mặc dù pow( base, exp )là một gợi ý tuyệt vời, hãy lưu ý rằng nó thường hoạt động ở điểm nổi.

Điều này có thể hoặc không thể là những gì bạn muốn: trên một số hệ thống, một vòng lặp đơn giản nhân trên bộ tích lũy sẽ nhanh hơn cho các kiểu số nguyên.

Và đối với hình vuông cụ thể, bạn cũng có thể tự nhân các số với nhau, dấu phẩy động hoặc số nguyên; nó không thực sự làm giảm khả năng đọc (IMHO) và bạn tránh được chi phí hiệu năng của một cuộc gọi chức năng.


Và vâng, điều này có thể rơi vào loại "tối ưu hóa sớm", nhưng tôi luôn thấy tốt khi nhận thức được những điều như thế này - đặc biệt nếu bạn phải lập trình trong môi trường tài nguyên hạn chế.
leander

11

Tôi không đủ danh tiếng để bình luận, nhưng nếu bạn thích làm việc với QT, họ có phiên bản riêng.

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

Hoặc nếu bạn không sử dụng QT, cmath về cơ bản cũng có điều tương tự.

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

// định nghĩa của hàm growToPower

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
Câu trả lời của bạn nên chứa phần giải thích về mã của bạn và mô tả cách giải quyết vấn đề.
AbcAeffchen

conio.h không dùng tệp tiêu đề không chuẩn không sử dụng.
HaseeB Mir

7

nếu bạn chỉ muốn giao dịch với base_2 thì tôi khuyên bạn nên sử dụng toán tử shift trái << thay vì thư viện toán học .

mã mẫu:

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

đầu ra mẫu:

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

6

Đó là pow hoặc powf trong <math.h>

Không có toán tử infix đặc biệt như trong Visual Basic hay Python


2
powf () là một hàm C99 không có trong C ++.
newacct

6

Nhiều câu trả lời đã đề xuất pow()hoặc thay thế tương tự hoặc thực hiện riêng của họ. Tuy nhiên, với các ví dụ ( 2^1, 2^22^3) trong câu hỏi của bạn, tôi sẽ đoán cho dù bạn chỉ cần tăng 2đến một sức mạnh số nguyên. Nếu đây là trường hợp, tôi sẽ đề nghị bạn sử dụng 1 << ncho 2^n.


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

Tiêu đề câu hỏi ban đầu của bạn là sai lệch. Để chỉ vuông , sử dụng 2*2.



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

Tôi đang sử dụng thư viện cmathhoặc math.hđể sử dụng các pow()chức năng của thư viện chăm sóc quyền hạn

#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

Đầu tiên thêm #include <cmath>sau đó bạn có thể sử dụng powmethode trong mã của bạn chẳng hạn:

pow(3.5, 3);

3,5cơ sở3exp


1

sử dụng hàm pow () trong thư viện cmath, tgmath hoặc 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;
}

xin lưu ý rằng nếu bạn cung cấp năng lượng đầu vào như bất kỳ loại dữ liệu nào ngoài dài gấp đôi thì câu trả lời sẽ được tăng lên gấp đôi. đó là nó sẽ lấy đầu vào và cho đầu ra là gấp đôi. đối với đầu vào kép dài, kiểu trả về dài gấp đôi. để thay đổi câu trả lời cho int use, int c = (int) pow (a, b)

Nhưng, hãy nhớ rằng một số con số này có thể dẫn đến một số ít hơn câu trả lời đúng. vì vậy, ví dụ bạn phải tính 5 ^ 2, thì câu trả lời có thể được trả về là 24.99999999999 trên một số trình biên dịch. khi thay đổi kiểu dữ liệu thành int, câu trả lời sẽ là 24 thay vì 25 câu trả lời đúng. Vì vậy, làm điều này

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

Bây giờ, câu trả lời của bạn sẽ chính xác. Ngoài ra, đối với số lượng rất lớn, dữ liệu bị mất khi thay đổi kiểu dữ liệu gấp đôi thành dài dài int. ví dụ bạn viết

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

và đưa ra đầu vào a = 3 và b = 38 thì kết quả sẽ là 1350851717672992000 trong khi câu trả lời đúng là 1350851717672992089, điều này xảy ra vì hàm pow () trả về 1.35085e + 18 được thăng cấp thành int là 1350851717672992000. chức năng quyền lực tùy chỉnh cho các tình huống như vậy, như: -

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

và sau đó gọi nó bất cứ khi nào bạn muốn,

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

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

return 0;
}

Đối với các số lớn hơn phạm vi int dài dài, hãy sử dụng thư viện boost hoặc chuỗi.


1
Tên chứa __được bảo lưu, có lẽ bạn nên chọn một cái gì đó khác.
HolyBlackCat
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.