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"}