[*]азин(0.5) должен вернуть 30 Степени, но в настоящее время он возвращается 0,5000063464 .
[*]acos(0.5) должен вернуться 60 градусы, но в настоящее время он возвращает 89,4999936544 .
[*] Atan (1) должен вернуть 45 градусы, но в настоящее время он возвращает 0,9998984794 . < Br /> < /ul>
2) Пределы проверки не применяются правильно в режиме степени: < /strong> < /p>
[*] Входная проверка (validateinversetrigargument) только проверяет, что аргументы находятся в пределах диапазона [-1, 1], что подходит для радиан, но не применяется к градусам [/b].
< /ul>
Это код, который является частью класса оценщика: < /strong> < /p>
Код: Выделить всё
fun setRadianMode(isRadian: Boolean) {
isRadianMode = isRadian
}
fun isInRadianMode(): Boolean = isRadianMode
// Validate arguments for inverse trig functions
private fun validateInverseTrigArgument(func: String, argument: String): Boolean {
return try {
val value = symbols.eval(argument)
when (func) {
"asin", "acos" -> value in -1.0..1.0
else -> true
}
} catch (e: Exception) {
false // If evaluation fails, consider it invalid
}
}
private fun convertTrigFunctions(expression: String): String {
val trigFunctions = listOf("sin", "cos", "tan", "cot")
val inverseTrigFunctions = listOf("asin", "acos", "atan", "acot")
var modifiedExpression = expression
// First handle regular trig functions
for (func in trigFunctions) {
val regex = "$func\\(".toRegex()
val matches = regex.findAll(modifiedExpression)
for (match in matches.toList().reversed()) {
val startIndex = match.range.last + 1
val endIndex = try {
findMatchingParenthesis(modifiedExpression, startIndex)
} catch (e: IllegalArgumentException) {
// If no closing parenthesis, treat end of expression as the closing point
modifiedExpression.length
}
val argument = modifiedExpression.substring(startIndex, endIndex)
val convertedArgument = if (!isRadianMode) {
"$func($argument * $PI / 180)"
} else {
"$func($argument)"
}
modifiedExpression = modifiedExpression.replaceRange(match.range.first, endIndex, convertedArgument)
}
}
// Then handle inverse trig functions separately
for (func in inverseTrigFunctions) {
val regex = "$func\\(".toRegex()
val matches = regex.findAll(modifiedExpression)
for (match in matches.toList().reversed()) {
val startIndex = match.range.last + 1
val endIndex = try {
findMatchingParenthesis(modifiedExpression, startIndex)
} catch (e: IllegalArgumentException) {
modifiedExpression.length
}
val argument = modifiedExpression.substring(startIndex, endIndex)
// Convert output of inverse trig function to degrees if in degree mode
val convertedArgument = if (!isRadianMode) {
"$func($argument) * 180 / $PI"
} else {
"$func($argument)"
}
modifiedExpression = modifiedExpression.replaceRange(match.range.first, endIndex, convertedArgument)
}
}
return modifiedExpression
}
https://github.com/preda/arithmetic
Я попробовал это с математической библиотекой Java, но не повезло [/b]
private fun evaluateInverseTrigFunction(func: String, argument: Double): Double {
val result = when (func) {
"asin" -> Math.asin(argument)
"acos" -> Math.acos(argument)
"atan" -> Math.atan(argument)
else -> throw IllegalArgumentException("Invalid function: $func")
}
// Convert to degrees if not in radian mode
return if (!isRadianMode) result * 180 / Math.PI else result
}
private fun convertTrigFunctions(expression: String): String {
val trigFunctions = listOf("sin", "cos", "tan", "cot")
val inverseTrigFunctions = listOf("asin", "acos", "atan", "acot")
var modifiedExpression = expression
// Handle regular trig functions as before
for (func in trigFunctions) {
val regex = "$func\\(".toRegex()
val matches = regex.findAll(modifiedExpression)
for (match in matches.toList().reversed()) {
val startIndex = match.range.last + 1
val endIndex = try {
findMatchingParenthesis(modifiedExpression, startIndex)
} catch (e: IllegalArgumentException) {
modifiedExpression.length
}
val argument = modifiedExpression.substring(startIndex, endIndex)
val convertedArgument = if (!isRadianMode) {
"$func($argument * $PI / 180)"
} else {
"$func($argument)"
}
modifiedExpression = modifiedExpression.replaceRange(match.range.first, endIndex, convertedArgument)
}
}
// Handle inverse trig functions
for (func in inverseTrigFunctions) {
val regex = "$func\\(([^)]+)\\)".toRegex() // Match function argument inside parentheses
val matches = regex.findAll(modifiedExpression)
for (match in matches.toList().reversed()) {
val argumentStr = match.groupValues[1]
// Evaluate the argument expression as a Double
val argument = symbols.eval(argumentStr)
// Get result from evaluateInverseTrigFunction
val result = evaluateInverseTrigFunction(func, argument)
// Replace original function call with the computed result
modifiedExpression = modifiedExpression.replaceRange(match.range, result.toString())
}
}
return modifiedExpression
}
< /code>
Функции обратных тригеров: когда конверттригфункции обнаруживает обратную функцию тригея (например, Asin, ACOS, Atan): < /p>
Он извлекает аргумент и оценивает его как двойной. Он заменяет исходный вызов функции в выражении вычисленным результатом. br /> fun testAsinInDegreeMode() {
println("Test asin function in degree mode:")
evaluator.setRadianMode(false)
val result = evaluator.evaluate("asin(0.5)")
assertEquals("30", result) // asin(0.5) in degrees is 30
}
< /code>
test asin -функция в режиме степени: < /strong>
орг.junit.comparisonfailure:
ожидается: 30
Actual: 0.5000063464 < /p>
test acos function в режиме степени: < /strong>
орг.junit.comparisonfailure:
ожидается: 60
Actual: 89.499993654 < /p>
Проверка функции Atan в режиме степени: < /strong>
орг.junit.comparisonfailure:
ожидается: 45
actual: 0.9998984794 < /p>
fun testInvalidAsinArgument() {
println("Test invalid argument for asin in degree mode (greater than 1):")
evaluator.setRadianMode(false)
val result = evaluator.evaluate("asin(2.0)")
assertEquals("Error: Unable to show the result", result)
}
< /code>
тест неверный аргумент для Asin в режиме степени (больше 1): < /strong>
орг.junit.comparisonfailure:
ожидается: ошибка: невозможно показать результат
фактическая: 2.0004063794 < /p>
Тест Неверный аргумент для ACO в режиме степени (больше 1 ): < /strong>
орг.junit.comparisonfailure:
ожидается: ошибка: невозможно показать результат
фактическая: 87.999593621
Подробнее здесь: https://stackoverflow.com/questions/791 ... in-calcula