mamhh's blog

By mamhh, 14 years ago, In English
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

thnx in advance :) .
  • Vote: I like it
  • +3
  • Vote: I do not like it

| Write comment?
14 years ago, # |
  Vote: I like it 0 Vote: I do not like it
Try to make it like this: " pow( 10 , (int)str.size()-1 ) "
14 years ago, # |
  Vote: I like it -20 Vote: I do not like it
Use,
#include <math> instead of #include<math.h>
14 years ago, # |
  Vote: I like it -11 Vote: I do not like it
just do not use the built in pow() . Make your own function for  pow().

14 years ago, # |
  Vote: I like it +3 Vote: I do not like it
This code is not compliled: pow( 10 , str.size()-1 ).
This code pow( 10.0 , 2) returns expected 100 as output.
14 years ago, # |
  Vote: I like it 0 Vote: I do not like it
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 ).

14 years ago, # |
  Vote: I like it +6 Vote: I do not like it
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.
14 years ago, # |
  Vote: I like it 0 Vote: I do not like it
For int,long int data type you can use this simple function:

template<class T> 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.
  • 14 years ago, # ^ |
      Vote: I like it 0 Vote: I do not like it
    In addition, in <math> 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.
»
11 years ago, # |
  Vote: I like it -11 Vote: I do not like it

I too hate this kind of precision errors in C++.

»
9 years ago, # |
  Vote: I like it -8 Vote: I do not like it

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

»
9 years ago, # |
  Vote: I like it 0 Vote: I do not like it

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!

»
6 years ago, # |
Rev. 2   Vote: I like it +11 Vote: I do not like it

Here my code with builtin fast_power which work in O(log(N))

#include "bits/stdc++.h"
#include <ext/numeric>
using namespace std;
using namespace __gnu_cxx;
int main()
{
   cout<<power(2,3);
}
»
6 years ago, # |
Rev. 5   Vote: I like it +10 Vote: I do not like it

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'))
»
5 years ago, # |
  Vote: I like it 0 Vote: I do not like it

Using ceil( pow(base,exponent) ) worked for me.

»
4 years ago, # |
  Vote: I like it -17 Vote: I do not like it

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.

  • »
    »
    4 years ago, # ^ |
      Vote: I like it +10 Vote: I do not like it

    Imagine reviving a 10 year old blog just to say that...

»
4 years ago, # |
Rev. 2   Vote: I like it -8 Vote: I do not like it

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....