Ноль в Double и String - C#
Формулировка задачи:
Здравствуйте! Написал я какое-то подобие программы, реализующей метод золотого сечения (для функции определяемой пользователем).
Проблема в том, что при x и y близких к нулю происходят ошибки. Подскажите, пожалуйста, как их избежать. (Во избежание лишних вопросов сразу говорю: функция translat - копипаста из интернета.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace golden_section_method { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { double a, b, eps, x1, x2, y1 ,y2, y; a = Convert.ToDouble(textBox3.Text); b = Convert.ToDouble(textBox5.Text); eps = Convert.ToDouble(textBox2.Text); double phi = (1 + Math.Sqrt(5)) / 2; x1 = b - (b - a) / phi; x2 = a + (b - a) / phi; y1 = f(x1); y2 = f(x2); while (Math.Abs(b - a) >= eps) { if (y1 <= y2) { b = x2; x2 = x1; x1 = b - (b - a) / phi; y2 = y1; y1 = f(x1); } else { a = x1; x1 = x2; x2 = a + (b - a) / phi; y1 = y2; y2 = f(x2); } } y = min(y1, y2); textBox1.Text = string.Format("{0,4:F5}", y); } public double f(double x) { string s = textBox4.Text.Replace("x", x.ToString()); return translat(s); } public double min(double y1, double y2) { if (y1 < y2) return y1; else return y2; } static double translat(string expression) { var operations = new char[] { '^', '*', '/', '+', '-' }; int brkCounter = 0; int brkEnd = 0; for (int i = expression.Length - 1; i >= 0; i--) { if (expression[i] == ')') { if (brkCounter == 0) brkEnd = i; brkCounter++; } if (expression[i] == '(') { brkCounter--; if (brkCounter == 0) { expression = expression.Remove(i, brkEnd - i + 1). Insert(i, translat(expression.Substring(i + 1, brkEnd - i - 1)).ToString()); brkEnd = 0; } } } foreach (char op in operations) { var opPosition = expression.IndexOf(op); if (opPosition < 0) continue; string leftArg = ""; int subExprStart = opPosition; for (int i = opPosition - 1; i >= 0; i--) { if (operations.Contains<char>(expression[i]) && !(expression[i] == '-' && i == 0)) break; leftArg = expression[i] + leftArg; subExprStart = i; } if (leftArg == "") break; string rightArg = ""; int subExprEnd = opPosition; for (int i = opPosition + 1; i < expression.Length; i++) { if (operations.Contains<char>(expression[i]) && !(expression[i] == '-' && i == opPosition + 1)) break; rightArg += expression[i]; subExprEnd = i; } string localResult = "1"; switch (op) { case '^': localResult = (Math.Pow(double.Parse(leftArg), double.Parse(rightArg))).ToString(); break; case '*': localResult = (double.Parse(leftArg) * double.Parse(rightArg)).ToString(); break; case '/': localResult = (double.Parse(leftArg) / double.Parse(rightArg)).ToString(); break; case '+': localResult = (double.Parse(leftArg) + double.Parse(rightArg)).ToString(); break; case '-': localResult = (double.Parse(leftArg) - double.Parse(rightArg)).ToString(); break; } expression = expression.Remove(subExprStart, subExprEnd - subExprStart + 1); expression = expression.Insert(subExprStart, localResult); } return double.Parse(expression); } } }
Решение задачи: «Ноль в Double и String»
textual
Листинг программы
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US"); this.Text = String.Format("{0:f9}", (double.Parse("0.000000007") - double.Parse("0.000000005")));
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д