Spaces:
Sleeping
Sleeping
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"} | |