/// <summary> /// Deals with trigonometric function button clicks. /// </summary> private void trigFunction(object sender, RoutedEventArgs e) { if (errors.Contains(resultBox.Text)) { return; } Button button = (Button)sender; string buttonText = button.Content.ToString(); string equation = ""; string result = ""; BigDecimal number = getNumber(); switch (currentTrigMode) { // Standard trig functions case trigModes.STANDARD: double radianAngle = Angles.Converter.radians((double)number, angleUnit); switch (buttonText) { case "sin": equation = "sin(" + number.ToString() + ")"; result = Math.Sin(radianAngle).ToString(); break; case "cos": equation = "cos(" + number.ToString() + ")"; result = Math.Cos(radianAngle).ToString(); break; case "tan": equation = "tan(" + number.ToString() + ")"; result = Math.Tan(radianAngle).ToString(); break; } break; // Hyperbolic trig functions case trigModes.HYPERBOLIC: switch (buttonText) { case "sinh": equation = "sinh(" + number + ")"; result = Math.Sinh((double)number).ToString(); break; case "cosh": equation = "cosh(" + number + ")"; result = Math.Cosh((double)number).ToString(); break; case "tanh": equation = "tanh(" + number + ")"; result = Math.Tanh((double)number).ToString(); break; } break; // Arc trig functions case trigModes.ARC: switch (buttonText) { case "asin": equation = "asin(" + number + ")"; result = Math.Asin((double)number).ToString(); break; case "acos": equation = "acos(" + number + ")"; result = Math.Acos((double)number).ToString(); break; case "atan": equation = "atan(" + number + ")"; result = Math.Atan((double)number).ToString(); break; } break; } // We need to convert the result to the given angle unit if arc trig functions are used if (currentTrigMode == trigModes.ARC) { switch (angleUnit) { case Angles.units.DEGREES: result = Angles.Converter.degrees(double.Parse(result), Angles.units.RADIANS).ToString(); break; case Angles.units.GRADIANS: result = Angles.Converter.gradians(double.Parse(result), Angles.units.RADIANS).ToString(); break; default: // 'result' is in radians by default break; } } if (operationCheck) { equation = equationBox.Text + equation; functionCheck = true; } updateEquationBox(equation); showText(result); }
/// <summary> /// Deals with function button clicks. /// </summary> private void function(object sender, RoutedEventArgs e) { if (errors.Contains(resultBox.Text)) { return; } Button button = (Button)sender; string buttonText = button.Content.ToString(); BigDecimal number = getNumber(); string equation = ""; string result = ""; switch (buttonText) { // C# doesn't have a Math.factorial()? Who the f**k does that?! case "n!": if (number < 0 || number.ToString().Contains(".")) { showError(INVALID_INPUT); return; } if (number > 3248) // chose this number because the default windows calculator doesn't go beyond this number { showError(OVERFLOW); return; } double res = 1; if (number == 1 || number == 0) { result = res.ToString(); } else { for (int i = 2; i <= number; i++) { res *= i; } } equation = "fact(" + number.ToString() + ")"; result = res.ToString(); break; case "ln": equation = "ln(" + number + ")"; result = ((BigDecimal)Math.Log((double)number)).ToString(); break; case "log": equation = "log(" + number + ")"; result = Math.Log10((double)number).ToString(); break; case "√": equation = "√(" + number + ")"; result = Math.Sqrt((double)number).ToString(); break; case "+/-": equation = "negate(" + number + ")"; result = BigDecimal.Negate(number).ToString(); break; case "F-E": int eidx = resultBox.Text.IndexOf('E'); if (eidx != -1) { BigDecimal bf = number; int exp = 0; while (bf > 10 || bf < 1) { if (bf > 10) { bf /= 10; ++exp; } else if (bf < 1) { bf *= 10; --exp; } else { break; } } result = bf + (exp > 0 ? "E+" : "E") + exp; } else { } equation = "F-E(" + number + ")"; break; } if (operationCheck) { equation = equationBox.Text + equation; functionCheck = true; } updateEquationBox(equation); showText(result); }