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