Ноль в 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")));

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.778 из 5