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

Я создаю калькулятор, строго используя 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, & 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 для преобразования радианов в градусы, как я уже говорил, это работает везде, и я даже проверял это, и это просто портит все другие расчеты вверх и не решают текущую проблему.

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


person Gnago    schedule 23.10.2016    source источник


Ответы (1)


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

person Community    schedule 23.10.2016
comment
Если вы хотите сделать toDegrees(Math.asin(val1)), я уже пробовал это (и даже хотел упомянуть об этом в вопросе, но забыл), все равно не работает. Например, toDegrees(Math.asin(.5)) = 0.009138522593601258, где должно быть 30, и toDegrees(Math.acos(.5)) = 0.018277045187202516, где должно быть 60. - person Gnago; 23.10.2016
comment
@Gnago: Ваша функция toDegrees не преобразуется в градусы. Напишите function toDegrees(radians) { return radians * 180 / Math.PI; } и function toRadians(degrees) { return degrees * Math.PI / 180; }. - person Ry-♦; 23.10.2016
comment
Да, это решило проблему, я избегал всего этого, потому что это работало везде. Ок, спасибо за помощь - person Gnago; 23.10.2016