a53

media geometrica ANDRU

a53
Nov 27th, 2017
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.04 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. int n;
  6. vector <double>v;
  7. double x;
  8.  
  9. double geometricMean(vector<double> const & data)
  10. {
  11. long long ex = 0;
  12. auto do_bucket = [&data,&ex](int first,int last) -> double
  13. {
  14. double ans = 1.0;
  15. for ( ;first != last;++first)
  16. {
  17. int i;
  18. ans *= frexp(data[first],&i);
  19. ex+=i;
  20. }
  21. return ans;
  22. };
  23.  
  24. const int bucket_size = -log2( numeric_limits<double>::min() );
  25. size_t buckets = data.size() / bucket_size;
  26.  
  27. double invN = 1.0 / data.size();
  28. double m = 1.0;
  29.  
  30. for (size_t i = 0;i < buckets;++i)
  31. m *= std::pow( do_bucket(i * bucket_size,(i+1) * bucket_size),invN );
  32.  
  33. m*= pow( do_bucket( buckets * bucket_size, data.size() ),invN );
  34.  
  35. return pow(numeric_limits<double>::radix,ex * invN ) * m;
  36. }
  37. int main()
  38. {
  39. int i;
  40. cin>>n;
  41. for(i=0;i<n;i++)
  42. {
  43. cin>>x;
  44. v.push_back(x);
  45. }
  46. cout<<fixed<<setprecision(2)<<geometricMean(v);
  47. return 0;
  48. }
Add Comment
Please, Sign In to add comment