Проблема в математических функциях для Lua

#lua

#lua

Вопрос:

Мы поставили задачу как

Считайте угол в градусах и выводите значения этого угла tan, cosec, sec и cot в том же порядке. Для использования с помощью функции rad() преобразуйте угол из градусов в радианы для стандартных библиотечных функций.

Для которого мы написали код как

 x = io.read()

radianVal = math.rad (x)

io.write(string.format("%.1f ", math.tan(radianVal)),"n")

io.write(string.format("%.1f ", math.cosh(radianVal)),"n")

io.write(string.format("%.1f ", math.sinh(radianVal)),"n")

io.write(string.format("%.1f ", math.cos(radianVal)),"n")
  

Но результат не такой, как ожидалось, не уверен, где мы ошиблись

 Run as Custom Input
30

Your Output (stdout)
0.6 
1.1 
0.5 
0.9 

Expected Output
0.57735026918963
2.0
1.1547005383793
1.7320508075689
  

Правильный код, который работает идеально, это

 x = io.read()

function cot(radAngle)
  return 1 / math.tan(radAngle)
end

function cosec(radAngle)
  return 1 / math.sin(radAngle)
end

function sec(radAngle)
  return 1 / math.cos(radAngle)
end

local radAngle = math.rad(x)
print(math.tan(radAngle))
print(cosec(math.rad(x)))
print(sec(math.rad(x)))
print(cot(math.rad(x)))
  

Ответ №1:

Как вы можете ожидать получения правильного результата, если вы вычисляете cosh(x) вместо csc(x) ? Вы используете гиперболический косинус для вычисления косеканта. Я думаю, очевидно, почему ваши результаты не приняты.

Вы используете sinh(x) для вычисления sec(x) и cos(x) для вычисления cot(x) .

Вы путаете математические функции. Это не проблема программирования на Lua.

Я предлагаю вам потратить несколько часов на изучение тригонометрических функций.

https://en.wikipedia.org/wiki/Trigonometric_functions

Такие значения вычисляются с использованием правильной формулы или функции. Не при использовании какой-либо функции математической библиотеки с похожим именем.

cosh устарел, начиная с Lua 5.3, кстати.

Вы можете использовать math.tan для вычисления касательных вашего угла.

Для секущих, косекантных и котангенс вам придется реализовать свои собственные функции.

Также обратите внимание, что количество десятичных знаков может вызвать проблему при проверке результата. Убедитесь, что можно округлить до 1 после запятой.

Пример:

Нет функции для вычисления котангенса угла. Итак, мы определяем один.

 function cot(radAngle)
  return 1 / math.tan(radAngle)
end

local radAngle = math.rad(30)
print("tan(30°):", math.tan(radAngle))
print("cot(30°):", cot(math.rad(30)))

->
tan(30°):   0.57735026918963
cot(30°):   1.7320508075689
  

Комментарии:

1. Теперь мы используем x = io.read() radianVal = math.rad (x) io.write(string.format(«%.1f «, math.tan(radianVal)), «n») io.write(string.format(«%.1f «, math.csc(radianVal)), «n») io.write(string.format(«%.1f «, math.sec(radianVal)), «n») io.write(string.format(«% .1f «, math.cot(radianVal)), » n») выдает ошибку как lua5.3: Решение.lua:11: попытка вызвать нулевое значение (поле ‘cot’) трассировка стека: Решение.lua: 11: в основном блоке [C]: в ?

2. Я говорил вам, что вы должны реализовать эти функции самостоятельно. нет math.cot., нет math.sec и нет math.csc. следовательно, вы не можете вызвать эти функции. пожалуйста, прочитайте мой ответ, а не только его части. также обратитесь к руководству по Lua, прежде чем пытаться использовать какие-либо функции. здесь вы узнаете, существуют ли эти функции и как их правильно использовать. вы можете вычислить все эти значения из существующих функций.

3. спасибо, понял, но не могли бы вы пояснить это, прочитайте угол в градусах и, чтобы использовать функцию rad (), преобразуйте угол из градусов в радианы для стандартных библиотечных функций. Также для tan, который мы получаем как 0.6, он должен быть 0.57735026918963, как его получить

4. смотрите редактирование. ваш 0.6 вызван округлением 0.577… до 1 цифры. Пожалуйста, ознакомьтесь с некоторыми математическими основами, прежде чем начать программировать.

5. спасибо, проблема решена после комментариев ur и повторного использования математической функции