Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- int n;
- vector <double>v;
- double x;
- double geometricMean(vector<double> const & data)
- {
- long long ex = 0;
- auto do_bucket = [&data,&ex](int first,int last) -> double
- {
- double ans = 1.0;
- for ( ;first != last;++first)
- {
- int i;
- ans *= frexp(data[first],&i);
- ex+=i;
- }
- return ans;
- };
- const int bucket_size = -log2( numeric_limits<double>::min() );
- size_t buckets = data.size() / bucket_size;
- double invN = 1.0 / data.size();
- double m = 1.0;
- for (size_t i = 0;i < buckets;++i)
- m *= std::pow( do_bucket(i * bucket_size,(i+1) * bucket_size),invN );
- m*= pow( do_bucket( buckets * bucket_size, data.size() ),invN );
- return pow(numeric_limits<double>::radix,ex * invN ) * m;
- }
- int main()
- {
- int i;
- cin>>n;
- for(i=0;i<n;i++)
- {
- cin>>x;
- v.push_back(x);
- }
- cout<<fixed<<setprecision(2)<<geometricMean(v);
- return 0;
- }
Add Comment
Please, Sign In to add comment