### mamhh's blog

By mamhh, 12 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 (21)
| Write comment?
 Try to make it like this: " pow( 10 , (int)str.size()-1 ) "
•  12 years ago, # ^ | ← Rev. 2 →   (int) (pow(a,b) + EPS);Here, EPS can be something like 1e-9.
•  There is no header file [itex]. What was the idea of your suggestion?
•  @Zlobober,it's simplehe wanted to imsert his word =)@mamhh,Try not to use pow() with int's, because he can not work with integers => loss precisionhttp://www.cplusplus.com/reference/clibrary/cmath/pow/
 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 );orpow( (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!
 » 4 years 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<
 » 4 years ago, # | ← Rev. 5 →   In C++, you can write a user-defined function long long pow10(int n) to compute and return the nth 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 10n 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.
 » pow(x, y) is most likely implemented as exp(y * log(x)) which can go off for surprisingly small integral arguments. This manifests itself in a particularly pathological way if the result is truncated to an integer.The moral of the story is to avoid the pow function when working in integer arithmetic.
•  » » Imagine reviving a 10 year old blog just to say that...
 » 3 years ago, # | ← Rev. 2 →   In case of resulting an int value try using binary exponentiation instead of pow() function.... It is more reliable than pow() function..you can see the here...Hope that this will help you to not getting this type of error again....
 » I also faced this type of problem. but when I need perfectly 1000, 9000 these types of numbers I create a function that will generate a string as "1000" or "9000" and then convert it into int using stoi() function and return it.