### mamhh's blog

By mamhh, 9 years ago, , Hi all, the function "pow( x , y )" should raise x to the y-th power , it works fine on my PC, but it gives me wrong answer on codeforces .

the problem is : I have a string , say "123", when I make call the function like this " pow( 10 , str.size()-1 ) " it returns "99"
why not returning "100"  ???

my code: http://pastebin.com/B1LXwys6
the problem  :  http://www.codeforces.com/problemset/problem/61/C c++, Comments (19)
 Try to make it like this: "  pow( 10 , (int)str.size()-1 )  "
•  9 years ago, # ^ | ← Rev. 2 →   (int) (pow(a,b) + EPS); Here, EPS can be something like 1e-9.
•  9 years ago, # ^ | ← Rev. 6 →   @ tgoulart , thnx so much this is the correct try  : (int) (pow( 10.0 , str.size()-1 )+EPS) :)
•  There is no header file [itex]. What was the idea of your suggestion?
•  @Zlobober, it's simplehe wanted to imsert his word =) @ Try not to use pow() with int's, because he can not work with integers => loss precision
•  codeblocks pops an error saying "math:no such file or directory"
 just do not use the built in pow() . Make your own function for  pow().
 This code is not compliled: pow( 10 , str.size()-1 ). This code pow( 10.0 , 2) returns expected 100 as output.
 You should write pow(a,b) where a and b are double (not int)!So, your correct code must be: pow ( 10.0, 1.0*( ((int) s.size()) -1 ); or pow( (double) 10, 1.0*( ((int) s.size()) -1 ).
 pow is a floating-point function: double pow(double x, double y).  Like most of the other standard floating-point functions, the result of pow is only guaranteed to be approximately correct.  pow(10.0, 2.0) can be exactly 100.0, slightly greater, or slightly less.  If pow(10.0, 2.0) is slightly less than 100.0, casting it to the type int converts it to 99. If you use floating-point operations, handle numerical errors appropriately; it is painful but necessary. My recommendation is to avoid unnecessary uses of floating-point operations.  If both the input and the output are integers, you can avoid floating-point operations without much trouble in most cases.
 For int,long int data type you can use this simple function: template T power(T N,T P){ return (P==0)?  1: N*power(N,P-1); } Or make something like this for your own and add it in your template. You can also raise power lot faster using repeated squaring.
•  In addition, in [itex] there is two functions:  double pow ( double base, int exponent );long double pow ( long double base, int exponent ); They use fast power counting, just as you said.
 » I too hate this kind of precision errors in C++.
 » I had same problem in past contest.use this pow("m" is mod in the code,it is good for calculating (x^y)%m ,remove it if you don't use it):link
 » i think because the pow function must work with doubles it is O(N) instead of O(log(N))(if isn't tell me).because O(log(N)) pow is very useful try to use your pow with O(log(N))!thanx!
 » 17 months ago, # | ← Rev. 2 →   Here my code with builtin fast_power which work in O(log(N)) #include "bits/stdc++.h" #include using namespace std; using namespace __gnu_cxx; int main() { cout<
 » 17 months ago, # | ← Rev. 5 →   In C++, you can write a user-defined function long long pow10(int n) to compute and return the n th power of 10 for some non-negative integer 0 ≤ n ≤ 18 using the string-to-long-long conversion function string::stoll()as follows. inline long long pow10(int n) { return stoll("1"+string(n,'0')); } string(n,'0') constructs an n-character string filled with decimal zeros. When concatenated properly with "1", the sought string representation of 10 n is generated.You may use the C++ preprocessor to write the return expression as a #define macro as follows. #define pow10(n) stoll("1"+string(n,'0')) 
 » Using ceil( pow(base,exponent) ) worked for me.