Линейный алгоритм проверка функции
C# правильно ли написана у меня функция ? потому что при проверке не выдает нужные значения, хотя вроде всё правильно сделал, сам по себе новичок в C#
public static double Evaluate(string expression)
{
System.Data.DataTable table = new System.Data.DataTable();
table.Columns.Add("expression", string.Empty.GetType(), expression);
System.Data.DataRow row = table.NewRow();
table.Rows.Add(row);
return double.Parse((string)row["expression"]);
}
double x = Evaluate(textBox1.Text);
double y = Evaluate(textBox2.Text);
double z = Evaluate(textBox3.Text);
double a = Math.Exp(x-y) * Math.Pow(Math.Abs(x-y),x+y);
double b = Math.Atan(x) + Math.Atan(z);
double c = Math.Pow(Math.Sqrt(Math.Pow(x,6)) + Math.Pow(Math.Log(y),2),2/3);
double u = (a / b) + c;
textBox4.Text = "U = " + u;
Ответы (1 шт):
Автор решения: aepot
→ Ссылка
Переменная c должна выглядеть так:
double c = Math.Cbrt(Math.Pow(x, 6) + Math.Pow(Math.Log(y), 2));
Либо если вы используете древний фреймворк 4.x, где нет кубического корня Math.Cbrt, то вот так:
double c = Math.Pow(Math.Pow(x, 6) + Math.Pow(Math.Log(y), 2), 1.0 / 3);
Обратите внимание:
1 / 3 = 0 - целочисленное деление
1.0 / 3 = 0.(3) - а тут всё норм
Кстати, @Grundy прав, Math.Exp надо возводить в степень по модулю.
double a = Math.Exp(Math.Abs(x-y)) * Math.Pow(Math.Abs(x-y), x+y);
Я проверил в консоли:
double x = -2.235E-2;
double y = 2.23;
double z = 15.221;
double a = Math.Exp(Math.Abs(x - y)) * Math.Pow(Math.Abs(x - y), x + y);
double b = Math.Atan(x) + Math.Atan(z);
double c = Math.Cbrt(Math.Pow(x, 6) + Math.Pow(Math.Log(y), 2));
double u = a / b + c;
Console.WriteLine("U = " + u);
Вывод в консоль:
U = 39.37412527565023
Кстати, метод Evaluate можно немного упростить:
public static double Evaluate(string expression)
{
object result = DataTable.Compute(expression, string.Empty);
return result is string s && double.TryParse(s, out double n) ? n : 0;
}
Такая реализация метода никогда не выдаст исключения. Опционально, если 0 в качестве результата по умолчанию не подходит, то можно заменить на double.NaN.

