Geometric mean (Two Methods)
Last Updated :
18 Sep, 2022
Given an array of n elements, we need to find the geometric mean of the numbers. Generally geometric mean of n numbers is the nth root of their product.
If there are n elements x1, x2, x3, . . ., xn
in an array and if we want to calculate the
geometric mean of the array elements is
Geometric mean = (x1 * x2 * x3 * . . . * xn)1/n
Examples:
Input : arr[] = {1, 2, 3, 4, 5, 6, 7, 8}
Output : 3.76435
= (1 * 2 * 3 * 4 * 5 * 6 * 7 * 8)1/8
= 403201/8
= 3.76435
Input : arr[] = {15, 12, 13, 19, 10}
Output : 13.447
= (15 * 12 * 13 * 19 * 10)1/5
= 4446001/5
= 13.477
A simple solution is to multiply all numbers first, then find (1/n)-th power of the multiplication.
C++
#include <bits/stdc++.h>
using namespace std;
float geometricMean( int arr[], int n)
{
float product = 1;
for ( int i = 0; i < n; i++)
product = product * arr[i];
float gm = pow (product, ( float )1 / n);
return gm;
}
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
int n = sizeof (arr) / sizeof (arr[0]);
cout << geometricMean(arr, n);
return 0;
}
|
Java
import java.math.*;
class GFG{
static float geometricMean( int arr[], int n)
{
float product = 1 ;
for ( int i = 0 ; i < n; i++)
product = product * arr[i];
float gm = ( float )Math.pow(product, ( float ) 1 / n);
return gm;
}
public static void main(String args[])
{
int arr[] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 };
int n = arr.length ;
System.out.println(geometricMean(arr, n));
}
}
|
Python
import math
def geometricMean(arr, n) :
product = 1
for i in range ( 0 ,n) :
product = product * arr[i]
gm = ( float )(math. pow (product, ( 1 / n)))
return ( float )(gm)
arr = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ]
n = len (arr)
print ( '{0:.6f}' . format (geometricMean(arr, n)))
|
C#
using System;
class GFG{
static float geometricMean( int []arr, int n)
{
float product = 1;
for ( int i = 0; i < n; i++)
product = product * arr[i];
float gm = ( float )Math.Pow(product, ( float )1 / n);
return gm;
}
public static void Main()
{
int []arr = { 1, 2, 3, 4, 5, 6, 7, 8 };
int n = arr.Length ;
Console.WriteLine(geometricMean(arr, n));
}
}
|
PHP
<?php
function geometricMean( $arr , $n )
{
$product = 1;
for ( $i = 0; $i < $n ; $i ++)
$product = $product * $arr [ $i ];
$gm = pow( $product , (float)(1 / $n ));
return $gm ;
}
$arr = array (1, 2, 3, 4, 5, 6, 7, 8);
$n = sizeof( $arr );
echo (geometricMean( $arr , $n ));
?>
|
Javascript
<script>
function geometricMean(arr, n)
{
let product = 1;
for (let i = 0; i < n; i++)
product = product * arr[i];
let gm = Math.pow(product, 1 / n);
return gm;
}
let arr = [ 1, 2, 3, 4, 5, 6, 7, 8 ];
let n = arr.length ;
document.write(geometricMean(arr, n));
</script>
|
Output:
3.76435
Time Complexity: O(n) where n is size of given array
Auxiliary Space: O(1)
The above solution simply causes overflow. A better solution is to use log. There are n numbers and we need to calculate geometric mean using the formula :
Geometric mean = Antilog((log(x1) + log(x2) +
log(x3) + . . . + log(xn))/n)
For calculating the Antilog in programming we use exponent function (exp()).
C++
#include <bits/stdc++.h>
using namespace std;
float geometricMean( int arr[], int n)
{
float sum = 0;
for ( int i = 0; i < n; i++)
sum = sum + log (arr[i]);
sum = sum / n;
return exp (sum);
}
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
int n = sizeof (arr) / sizeof (arr[0]);
cout << geometricMean(arr, n);
return 0;
}
|
Java
import java.io.*;
class GFG
{
static float geometricMean( int []arr, int n)
{
float sum = 0 ;
for ( int i = 0 ; i < n; i++)
sum = sum + ( float )Math.log(arr[i]);
sum = sum / n;
return ( float )Math.exp(sum);
}
public static void main (String[] args)
{
int []arr = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 };
int n = arr.length;
System.out.println(geometricMean(arr, n));
}
}
|
Python3
import math
def geometricMean(arr, n):
sum = 0 ;
for i in range (n):
sum = sum + math.log(arr[i]);
sum = sum / n;
return math.exp( sum );
arr = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ];
n = len (arr);
print (geometricMean(arr, n));
|
C#
using System;
class GFG {
static float geometricMean( int []arr, int n)
{
float sum = 0;
for ( int i = 0; i < n; i++)
sum = sum + ( float )Math.Log(arr[i]);
sum = sum / n;
return ( float )Math.Exp(sum);
}
public static void Main ()
{
int []arr = { 1, 2, 3, 4, 5, 6, 7, 8 };
int n = arr.Length;
Console.WriteLine(geometricMean(arr, n));
}
}
|
PHP
<?php
function geometricMean( $arr , $n )
{
$sum = 0;
for ( $i = 0; $i < $n ; $i ++)
$sum = $sum + log( $arr [ $i ]);
$sum = $sum / $n ;
return exp ( $sum );
}
$arr = array (1, 2, 3, 4, 5, 6, 7, 8);
$n = count ( $arr );
echo geometricMean( $arr , $n );
?>
|
Javascript
<script>
function geometricMean(arr, n)
{
var sum = 0;
for ( var i = 0; i < n; i++)
sum = sum + Math.log(arr[i]);
sum = sum / n;
return Math.exp(sum);
}
var arr = [ 1, 2, 3, 4, 5, 6, 7, 8 ];
var n = arr.length;
document.write(geometricMean(arr, n).toFixed(5));
</script>
|
Output:
3.76435
Time Complexity: O(n)
Auxiliary Space: O(1)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...