Huanzhi (Hans) Mao
init
4d1746c
import math
from decimal import Decimal, InvalidOperation, getcontext
from typing import Dict, List, Optional, Union
import mpmath
class MathAPI:
def __init__(self):
self._api_description = "This tool belongs to the Math API, which provides various mathematical operations."
def logarithm(
self, value: float, base: float, precision: int
) -> Dict[str, float]:
"""
Compute the logarithm of a number with adjustable precision using mpmath.
Args:
value (float): The number to compute the logarithm of.
base (float): The base of the logarithm.
precision (int): Desired precision for the result.
Returns:
result (float): The logarithm of the number with respect to the given base.
"""
try:
# Set precision for mpmath
mpmath.mp.dps = precision
# Use mpmath for high-precision logarithmic calculations
result = mpmath.log(value) / mpmath.log(base)
return {"result": result}
except Exception as e:
return {"error": str(e)}
def mean(self, numbers: List[float]) -> Dict[str, float]:
"""
Calculate the mean of a list of numbers.
Args:
numbers (List[float]): List of numbers to calculate the mean of.
Returns:
result (float): Mean of the numbers.
"""
if not numbers:
return {"error": "Cannot calculate mean of an empty list"}
try:
return {"result": sum(numbers) / len(numbers)}
except TypeError:
return {"error": "All elements in the list must be numbers"}
def standard_deviation(self, numbers: List[float]) -> Dict[str, float]:
"""
Calculate the standard deviation of a list of numbers.
Args:
numbers (List[float]): List of numbers to calculate the standard deviation of.
Returns:
result (float): Standard deviation of the numbers.
"""
if not numbers:
return {"error": "Cannot calculate standard deviation of an empty list"}
try:
mean = sum(numbers) / len(numbers)
variance = sum((x - mean) ** 2 for x in numbers) / len(numbers)
return {"result": math.sqrt(variance)}
except TypeError:
return {"error": "All elements in the list must be numbers"}
def si_unit_conversion(
self, value: float, unit_in: str, unit_out: str
) -> Dict[str, float]:
"""
Convert a value from one SI unit to another.
Args:
value (float): Value to be converted.
unit_in (str): Unit of the input value.
unit_out (str): Unit to convert the value to.
Returns:
result (float): Converted value in the new unit.
"""
to_meters = {"km": 1000, "m": 1, "cm": 0.01, "mm": 0.001, "um": 1e-6, "nm": 1e-9}
from_meters = {unit: 1 / factor for unit, factor in to_meters.items()}
if not isinstance(value, (int, float)):
return {"error": "Value must be a number"}
if unit_in not in to_meters or unit_out not in from_meters:
return {
"error": f"Conversion from '{unit_in}' to '{unit_out}' is not supported"
}
try:
value_in_meters = value * to_meters[unit_in]
result = value_in_meters * from_meters[unit_out]
return {"result": result}
except OverflowError:
return {"error": "Conversion resulted in a value too large to represent"}
def imperial_si_conversion(
self, value: float, unit_in: str, unit_out: str
) -> Dict[str, float]:
"""
Convert a value between imperial and SI units.
Args:
value (float): Value to be converted.
unit_in (str): Unit of the input value.
unit_out (str): Unit to convert the value to.
Returns:
result (float): Converted value in the new unit.
"""
conversion = {
"cm_to_in": 0.393701,
"in_to_cm": 2.54,
"m_to_ft": 3.28084,
"ft_to_m": 0.3048,
"m_to_yd": 1.09361,
"yd_to_m": 0.9144,
"km_to_miles": 0.621371,
"miles_to_km": 1.60934,
"kg_to_lb": 2.20462,
"lb_to_kg": 0.453592,
"celsius_to_fahrenheit": 1.8,
"fahrenheit_to_celsius": 5 / 9,
}
if not isinstance(value, (int, float)):
return {"error": "Value must be a number"}
if unit_in == unit_out:
return {"result": value}
conversion_key = f"{unit_in}_to_{unit_out}"
if conversion_key not in conversion:
return {
"error": f"Conversion from '{unit_in}' to '{unit_out}' is not supported"
}
try:
if unit_in == "celsius" and unit_out == "fahrenheit":
result = (value * conversion[conversion_key]) + 32
elif unit_in == "fahrenheit" and unit_out == "celsius":
result = (value - 32) * conversion[conversion_key]
else:
result = value * conversion[conversion_key]
return {"result": result}
except OverflowError:
return {"error": "Conversion resulted in a value too large to represent"}
def add(self, a: float, b: float) -> Dict[str, float]:
"""
Add two numbers.
Args:
a (float): First number.
b (float): Second number.
Returns:
result (float): Sum of the two numbers.
"""
try:
return {"result": a + b}
except TypeError:
return {"error": "Both inputs must be numbers"}
def subtract(self, a: float, b: float) -> Dict[str, float]:
"""
Subtract one number from another.
Args:
a (float): Number to subtract from.
b (float): Number to subtract.
Returns:
result (float): Difference between the two numbers.
"""
try:
return {"result": a - b}
except TypeError:
return {"error": "Both inputs must be numbers"}
def multiply(self, a: float, b: float) -> Dict[str, float]:
"""
Multiply two numbers.
Args:
a (float): First number.
b (float): Second number.
Returns:
result (float): Product of the two numbers.
"""
if not isinstance(a, (int, float)) or not isinstance(b, (int, float)):
return {"error": "Both inputs must be numbers"}
try:
return {"result": a * b}
except TypeError:
return {"error": "Both inputs must be numbers"}
def divide(self, a: float, b: float) -> Dict[str, float]:
"""
Divide one number by another.
Args:
a (float): Numerator.
b (float): Denominator.
Returns:
result (float): Quotient of the division.
"""
try:
if b == 0:
return {"error": "Cannot divide by zero"}
return {"result": a / b}
except TypeError:
return {"error": "Both inputs must be numbers"}
def power(self, base: float, exponent: float) -> Dict[str, float]:
"""
Raise a number to a power.
Args:
base (float): The base number.
exponent (float): The exponent.
Returns:
result (float): The base raised to the power of the exponent.
"""
try:
return {"result": base**exponent}
except TypeError:
return {"error": "Both inputs must be numbers"}
def square_root(self, number: float, precision: int) -> Dict[str, float]:
"""
Calculate the square root of a number with adjustable precision using the decimal module.
Args:
number (float): The number to calculate the square root of.
precision (int): Desired precision for the result.
Returns:
result (float): The square root of the number, or an error message.
"""
try:
if number < 0:
return {"error": "Cannot calculate square root of a negative number"}
# Set the precision for the decimal context
getcontext().prec = precision
# Use Decimal for high-precision square root calculation
decimal_number = Decimal(number)
result = decimal_number.sqrt()
return {"result": result}
except (TypeError, InvalidOperation):
return {
"error": "Input must be a number or computation resulted in an invalid operation"
}
def absolute_value(self, number: float) -> Dict[str, float]:
"""
Calculate the absolute value of a number.
Args:
number (float): The number to calculate the absolute value of.
Returns:
result (float): The absolute value of the number.
"""
try:
return {"result": abs(number)}
except TypeError:
return {"error": "Input must be a number"}
def round_number(
self, number: float, decimal_places: int = 0
) -> Dict[str, float]:
"""
Round a number to a specified number of decimal places.
Args:
number (float): The number to round.
decimal_places (int): [Optional] The number of decimal places to round to. Defaults to 0.
Returns:
result (float): The rounded number.
"""
try:
return {"result": round(number, decimal_places)}
except TypeError:
return {
"error": "First input must be a number, second input must be an integer"
}
def percentage(self, part: float, whole: float) -> Dict[str, float]:
"""
Calculate the percentage of a part relative to a whole.
Args:
part (float): The part value.
whole (float): The whole value.
Returns:
result (float): The percentage of the part relative to the whole.
"""
try:
if whole == 0:
return {"error": "Whole value cannot be zero"}
return {"result": (part / whole) * 100}
except TypeError:
return {"error": "Both inputs must be numbers"}
def min_value(self, numbers: List[float]) -> Dict[str, float]:
"""
Find the minimum value in a list of numbers.
Args:
numbers (List[float]): List of numbers to find the minimum from.
Returns:
result (float): The minimum value in the list.
"""
if not numbers:
return {"error": "Cannot find minimum of an empty list"}
try:
return {"result": min(numbers)}
except TypeError:
return {"error": "All elements in the list must be numbers"}
def max_value(self, numbers: List[float]) -> Dict[str, float]:
"""
Find the maximum value in a list of numbers.
Args:
numbers (List[float]): List of numbers to find the maximum from.
Returns:
result (float): The maximum value in the list.
"""
if not numbers:
return {"error": "Cannot find maximum of an empty list"}
try:
return {"result": max(numbers)}
except TypeError:
return {"error": "All elements in the list must be numbers"}
def sum_values(self, numbers: List[float]) -> Dict[str, float]:
"""
Calculate the sum of a list of numbers.
Args:
numbers (List[float]): List of numbers to sum.
Returns:
result (float): The sum of all numbers in the list.
"""
if not numbers:
return {"error": "Cannot calculate sum of an empty list"}
try:
return {"result": sum(numbers)}
except TypeError:
return {"error": "All elements in the list must be numbers"}