Преобразование градусов не работает с обратной тригнометрией

#javascript #html #trigonometry #inverse #degrees

#javascript #HTML #тригонометрия #обратное #градусы

Вопрос:

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

Я хотел бы, чтобы это было так просто, как если бы мои преобразования были неправильными, но все остальное, использующее градусы (т. Е. неинверсную тригонометрию), работало отлично. Следующий код представляет собой части калькулятора, которые имеют какое-либо отношение к преобразованию в градусы и элементам тригонометрии.

ФРАГМЕНТ КОДА:

 <html>
 	<head>
      <script language="javascript" type="text/javascript">
        var degVal = true;
        var Deux = false;
        function toDegrees(angle, mode){ //This function converts radians to degrees, and vice versa
		  if (degVal == true){
		    mode = (Math.PI/180); //for some reason this incorrect conversion formula spits out the correct answers
		  }
		  else if (degVal == false){
			    mode = 1;
		  }
		  return angle * mode;
		  }
		function BasicTrig(TrigFunc, TrigInv){
		  var val1 = toDegrees(parseFloat(document.getElementById("value1").value));
		  var ansD = document.getElementById("answer");
          if (Deux == false){
		    ansD.value = TrigFunc(val1);
		  }
		  else if (Deux == true){
            ansD.value = TrigInv(val1); //For some reason, doesn't work in degrees
          }
		}
	    function MoreTrig(TrigEq, TrigEqInv){ // This function allows csc, sec, amp; cot to be performed
		  var val1 = toDegrees(parseFloat(document.getElementById("value1").value));
		  var ansD = document.getElementById("answer");
		  if (Deux == false){
		    ansD.value = 1 / TrigEq(val1);
		  }
		  else if (Deux == true){
            ansD.value = TrigEqInv(1 / val1); //Also doesn't work in degrees
          }
		}
        function Deuxieme(){ //2nd function (Calculator) button
          if (Deux == false){
            document.getElementById("LeDeux").style.backgroundColor = "orange";
			Deux = true;
			document.getElementById("sinbutton").value = "sin⁻¹"; //changes sin to sin⁻¹
			document.getElementById("cosbutton").value = "cos⁻¹"; //changes cos to cos⁻¹
			document.getElementById("tanbutton").value = "tan⁻¹"; //changes tan to tan⁻¹
			document.getElementById("cscbutton").value = "csc⁻¹"; //changes csc to csc⁻¹ csc being cosec for those who are used to that
			document.getElementById("secbutton").value = "sec⁻¹"; //changes sec to sec⁻¹
			document.getElementById("cotbutton").value = "cot⁻¹"; //changes cot to cot⁻¹
          }
		  else if (Deux == true){
            document.getElementById("LeDeux").style.backgroundColor = "";
		    Deux = false;
			document.getElementById("sinbutton").value = "sin";
			document.getElementById("cosbutton").value = "cos";
		    document.getElementById("tanbutton").value = "tan";
		    document.getElementById("cscbutton").value = "csc";
   		    document.getElementById("secbutton").value = "sec"; 			document.getElementById("cotbutton").value = "cot";
          }
		}
        function RadDegHighlight(){ //Switches between Radians and Degrees
		  if (degVal == true){
		    document.getElementById("drbutton").value = "rad";
			degVal = false;
		  }
		  else if (degVal == false){
		    document.getElementById("drbutton").value = "deg";
		    degVal = true;
		  }
		}
      </script>
    </head>
    <body>
	  <input type="text" placeholder="x" style="width:48.5%" id="value1"/>
	  <input type="button" id="LeDeux" style="width:23.5%" value="2nd" onclick="Deuxieme()"/>
	   <input type="button" id="drbutton" style="width:23.5%" value="deg" onclick="RadDegHighlight()"/>
	   <input type="button" id="sinbutton" style="width:23.5%" value="sin" onclick="BasicTrig(Math.sin, Math.asin)"/>
	   <input type="button" id="cosbutton" style="width:23.5%" value="cos" onclick="BasicTrig(Math.cos, Math.acos)"/>
	   <input type="button" id="tanbutton" style="width:23.5%" value="tan" onclick="BasicTrig(Math.tan, Math.atan)"/>
	   <input type="button" id="cscbutton" style="width:23.5%" value="csc" onclick="MoreTrig(Math.sin, Math.asin)"/>
	   <input type="button" id="secbutton" style="width:23.5%" value="sec" onclick="MoreTrig(Math.cos, Math.acos)"/>
	   <input type="button" id="cotbutton" style="width:23.5%" value="cot" onclick="MoreTrig(Math.tan, Math.atan)"/>
	   <input type="text" placeholder="Answer" style="width:100%" id="answer"/>
  </body>
</html>  

Я предполагаю, что проблема где-то в toDegrees , поскольку все остальное работает в радианах… что касается Math.PI/180 преобразования радианов в градусы, как я уже говорил ранее, оно работает везде, и я даже протестировал его, и это просто запутывает все остальные вычисления и не устраняет текущую проблему.

Я протестировал все остальные вычисления, и они верны. Опять же, все в радианах работает, но обратные функции не работают для градусов, в отличие от обычных функций.

Ответ №1:

Вы преобразуете входные данные обратной тригонометрической функции из радианов в градусы, но, во-первых, это не в радианах. Вам необходимо преобразовать выходные данные при использовании обратной тригнометрии.

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

1. Если вы хотите это сделать toDegrees(Math.asin(val1)) , я уже пробовал это (и даже хотел упомянуть об этом в вопросе, но забыл), все еще не работает. Например, toDegrees(Math.asin(.5)) = 0.009138522593601258 там, где оно должно быть 30, и toDegrees(Math.acos(.5)) = 0.018277045187202516 там, где оно должно быть 60.

2. @Gnago: Ваша toDegrees функция не преобразуется в градусы. Напишите function toDegrees(radians) { return radians * 180 / Math.PI; } и a function toRadians(degrees) { return degrees * Math.PI / 180; } .

3. Да, это решило проблему, я полностью избежал этого, потому что это работало везде. Ну что ж, спасибо вам за вашу помощь