Skip to content
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
[ADDED] Implementation of Geometric Mean.
  • Loading branch information
kmtGryffindor20 committed Oct 14, 2023
commit 09a4e3e10fc1e3d01c6f1eee982e25fd08b5d520
52 changes: 52 additions & 0 deletions maths/geometric_mean.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
"""
The Geometric Mean of n numbers is defined as the n-th root of the product
of those numbers. It is used to measure the central tendenct of the numbers.
https://en.wikipedia.org/wiki/Geometric_mean
"""
def compute_geometric_mean(*args: float) -> float:
"""
Return the geometric mean of the argument numbers.
>>> compute_geometric_mean(2,8)
4.0
>>> compute_geometric_mean('a', 4)
Traceback (most recent call last):
...
TypeError: Not a Number
>>> compute_geometric_mean(5, 125)
25.0
>>> compute_geometric_mean(1, 0)
0.0
>>> compute_geometric_mean(1, 5, 25, 5)
5.0
>>> compute_geometric_mean(2, -2)
Traceback (most recent call last):
...
ArithmeticError: Cannot Compute Geometric Mean for these numbers.
>>> compute_geometric_mean(-5, 25, 1)
-5.0
"""
product = 1
for number in args:
if (not isinstance(number, int)) and (not isinstance(number, float)) :
raise TypeError("Not a Number")
product *= number
# Cannot calculate the even root for negative product.
# Frequently they are restricted to being positive.
if product < 0 and len(args) % 2 == 0:
raise ArithmeticError("Cannot Compute Geometric Mean for these numbers.")
mean = abs(product)**(1./len(args))
# Since python calculates complex roots for negative products with odd roots.
if product < 0:
mean = -mean
# Since it does floating point arithmetic, it gives 64**(1/3) as 3.99999996
possible_mean = float(round(mean))
# To check if the rounded number is actually the mean.
if possible_mean**len(args) == product:
mean = possible_mean
return mean


if __name__ == '__main__':
from doctest import testmod
testmod(name='compute_geometric_mean')
print(compute_geometric_mean(-3, -27))