Линейный алгоритм проверка функции

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.

→ Ссылка