Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
1 / 1 / 0
Регистрация: 30.04.2016
Сообщений: 37
1

Почему неправильно считается простое математическое выражение?

08.06.2016, 18:27. Просмотров 1363. Ответов 11
Метки нет (Все метки)


Всем привет. Вопрос будет очень банальным: я правильно записал выражение?
C#
1
double R = (2 * Math.Pow(a, 3) - 9 * a * b + 27 * c) / 54;
Название: Screenshot_4.png
Просмотров: 53

Размер: 2.3 Кб. Потому-что, программа которую я пишу, выдает неправильный ответ в сравнении с онлайн калькулятором.
К примеру я задаю значения:
a= 4, b=-2, c=5, d=3; P.S. Присутствует переменная (d), она делит свое слагаемое на все заданные a, b, c, d. Калькулятор выдает ответ 1,287, а моя программа 0,474537037037037
К примеру Q - выдает правильный ответ!
Сам код программы:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
double fi, x, x1, x2, x3;
            Console.Write("Введите D ");
            double d = Double.Parse(Console.ReadLine());
            Console.Write("Введите A ");
            double a = Double.Parse(Console.ReadLine()) / d;
            Console.Write("Введите B ");
            double b = Double.Parse(Console.ReadLine()) / d;
            Console.Write("Введите C ");
            double c = Double.Parse(Console.ReadLine()) / d;
            double i = Math.Sqrt(-1);
            double Q = (Math.Pow(a, 2) - 3 * b) / 9;
            double R = (2 * Math.Pow(a, 3) - 9 * a * b + 27 * c) / 54;
            double S = Math.Pow(Q, 3) - Math.Pow(R, 2);
            Console.WriteLine(Q);
            Console.WriteLine(R);
            Console.WriteLine(S);
            Console.WriteLine();
            //ch = 2 / (Exp(x) – Exp(-x))
            //sh = 2 / (Exp(x) + Exp(-x))
            if (S > 0)
            {
                fi = 1 / 3 * Math.Acos(R / Math.Sqrt(Math.Pow(Q, 3)));
                x1 = -2 * Math.Sqrt(Q) * Math.Cos(fi) - a / 3;
                x2 = -2 * Math.Sqrt(Q) * Math.Cos(fi + (2 / 3 * Math.PI)) - a / 3;
                x3 = -2 * Math.Sqrt(Q) * Math.Cos(fi - (2 / 3 * Math.PI)) - a / 3;
            }
            else if (S < 0)
            {
                if (Q > 0)
                {
                    x = (Math.Abs(R) / Math.Sqrt(Math.Pow(Q, 3)));
                    // Arch = Log(x + Sqrt(x * x – 1))
                    fi = (1 / 3) * Math.Log(x + Math.Sqrt(x * x - 1));
                    x1 = -2 * Math.Sign(R) * Math.Sqrt(Q) * (2 / (Math.Exp(fi) - Math.Exp(-fi))) - a / 3;
                    x2 = Math.Sign(R) * Math.Sqrt(Q) * (2 / (Math.Exp(fi) - Math.Exp(-fi))) - a / 3 + (i * Math.Sqrt(3) * Math.Sqrt(Q)) * (Math.Exp(fi) + Math.Exp(-fi));
                }
                else if (Q < 0)
                {
                    x = (Math.Abs(R)) / Math.Sqrt(Math.Pow(Math.Abs(Q), 3));
                    // Arsh = Log(x + Sqrt(x * x + 1))
                    fi = 1 / 3 * Math.Log(x + Math.Sqrt(x * x + 1));
                    x1 = -2 * Math.Sign(R) * Math.Sqrt(Math.Abs(Q)) * (Math.Exp(fi) + Math.Exp(-fi)) - a / 3;
                    x2 = Math.Sign(R) * Math.Sqrt(Math.Abs(Q)) * (Math.Exp(fi) + Math.Exp(-fi)) - a / 3 + (i * Math.Sqrt(3) * Math.Sqrt(Math.Abs(Q))) * (Math.Exp(fi) - Math.Exp(-fi));
                    x3 = Math.Sign(R) * Math.Sqrt(Math.Abs(Q)) * (Math.Exp(fi) + Math.Exp(-fi)) - a / 3 - (i * Math.Sqrt(3) * Math.Sqrt(Math.Abs(Q))) * (Math.Exp(fi) - Math.Exp(-fi));
                    Console.WriteLine(fi);
                    Console.WriteLine(x1);
                    Console.WriteLine(x2);
                    Console.WriteLine(x3);
                }
            }
            Console.ReadKey();
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.06.2016, 18:27
Ответы с готовыми решениями:

Тригонометрические функции: неправильно считается результат
При выполнении программы неправильно считается результат. В частности в одной формуле надо...

Неправильно считается сумма, произведение нечётных положительных элементов массива
Найти сумму,произвидение нечётных положительных элементов массива Проблема в том,что например...

Математическое выражение
Здравствуйте уважаемые форумчане. Лично я зашел в тупик как это сделать. Запишите пожалуйста...

Вычислить математическое выражение
Вычислить математическое выражение

11
Администратор
Эксперт .NET
13109 / 10683 / 4406
Регистрация: 17.03.2014
Сообщений: 21,499
Записей в блоге: 1
08.06.2016, 19:07 2
fie4fix, формула расчета R записана правильно. Дело в чем-то другом. Например, в том как ты работаешь с комплексными числами.
C#
1
double i = Math.Sqrt(-1);
Переменная i будет равна NaN (Not a number - не число). Это специальное значение для дробных чисел. Любые операции с ним дадут тоже NaN. Вместо double следует использовать тип Complex как тебе уже объяснили.
0
183 / 182 / 96
Регистрация: 30.04.2016
Сообщений: 478
08.06.2016, 19:08 3
fie4fix, а моя программа в MATLAB выдает третий результат...
Matlab M
1
2
3
4
5
6
>> d=3;a= 4/d; b=-2/d; c=5/d;
>> (2 * a ^ 3 - 9 * a * b + 27 * c) / 54
 
ans =
 
    1.0693
Это я про переменную R... не знаю точно о какой переменной писали Вы...
0
1 / 1 / 0
Регистрация: 30.04.2016
Сообщений: 37
08.06.2016, 19:18  [ТС] 4
Проблема решена. Но теперь появилась новая. Переменная fi, не правильно дает вычисленный ответ!...

Добавлено через 1 минуту
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Complex как тебе уже объяснили
Я добавил в пространство имен System.Numerics; как мне записать комплекс i?
0
Эксперт .NET
7522 / 5016 / 1194
Регистрация: 25.05.2015
Сообщений: 15,297
Записей в блоге: 14
08.06.2016, 19:23 5
Цитата Сообщение от fie4fix Посмотреть сообщение
fi = (1 / 3)
Про типы данных почитайте и операции над ними. А то так и будете тыкаться наугад
Лучше явно указывать и тип, и скобочки.

Добавлено через 4 минуты
Цитата Сообщение от fie4fix Посмотреть сообщение
комплекс i?
https://msdn.microsoft.com/ru-... 10%29.aspx
0
1 / 1 / 0
Регистрация: 30.04.2016
Сообщений: 37
08.06.2016, 19:28  [ТС] 6
Цитата Сообщение от Rius Посмотреть сообщение
fi = (1 / 3)
Что со скобками, что без. Ответ один и тот-же!
0
Администратор
Эксперт .NET
13109 / 10683 / 4406
Регистрация: 17.03.2014
Сообщений: 21,499
Записей в блоге: 1
08.06.2016, 19:31 7
Цитата Сообщение от fie4fix Посмотреть сообщение
как мне записать комплекс i?
В этом нет необходимости. Твоя задача получить комплекное число. Тип Complex это позволяет. Например, строка
C#
1
x2 = Math.Sign(R) * Math.Sqrt(Q) * (2 / (Math.Exp(fi) - Math.Exp(-fi))) - a / 3 + (i * Math.Sqrt(3) * Math.Sqrt(Q)) * (Math.Exp(fi) + Math.Exp(-fi));
По идее должна быть записана так (переменную x2 следует объявить как Complex):
C#
1
2
3
4
5
6
x2 = new Complex(
    // Действительная часть
    Math.Sign(R) * Math.Sqrt(Q) * (2 / (Math.Exp(fi) - Math.Exp(-fi))) - a / 3,
    // Мнимая часть
    Math.Sqrt(3) * Math.Sqrt(Q) * (Math.Exp(fi) + Math.Exp(-fi))
);
Добавлено через 2 минуты
Цитата Сообщение от fie4fix Посмотреть сообщение
Что со скобками, что без
Дело не в скобочках, а в том что 1 и 3 это целые числа. Поэтому результат деления будет равен нолю. Нужно записать так:
(1.0 /3)
0
Эксперт .NET
7522 / 5016 / 1194
Регистрация: 25.05.2015
Сообщений: 15,297
Записей в блоге: 14
08.06.2016, 19:31 8
fie4fix,

Не по теме:

часть предложения про типы данных вы подсознательно пропустили как непонятную?)


1 и 3 - это целые числа. 1d и 3d, или 1.0 и 3.0 - double.
0
1 / 1 / 0
Регистрация: 30.04.2016
Сообщений: 37
08.06.2016, 19:40  [ТС] 9
Цитата Сообщение от Rius Посмотреть сообщение
часть предложения про типы данных вы подсознательно пропустили как непонятную?)
Просто время поджимает, и нет времени, что-то учить!) Насчет скобок, тупанул. Вы само выражение привели как аргумент. К тому-же. Уже часов 7 сижу за ноутбуком. Пытаюсь написать нормально код! И вообще ничего нормально не могу воспринимать!)
0
1 / 1 / 0
Регистрация: 30.04.2016
Сообщений: 37
08.06.2016, 20:53  [ТС] 10
Цитата Сообщение от Rius Посмотреть сообщение
1 и 3 - это целые числа. 1d и 3d, или 1.0 и 3.0 - double.
Это выражение правильно записал?
C#
1
x1 = -2.0 * Math.Sign(R) * Math.Sqrt(Math.Abs(Q)) * (Math.Exp(fi) + Math.Exp(-fi)) - a / 3.0;
Название: Screenshot_5.png
Просмотров: 41

Размер: 3.4 Кб Просто с ним тоже возникли трудности. Просто уже вообще ничего не соображаю. Скоро сдавать! Я извиняюсь за наглость!
0
Эксперт .NET
7522 / 5016 / 1194
Регистрация: 25.05.2015
Сообщений: 15,297
Записей в блоге: 14
08.06.2016, 21:01 11
У (a / 3.0) скобок не хватает, лишь для наглядности.
Насчёт гиперболического синуса не уверен. В википедии один из способов - (ex + e-x) / 2.
0
111 / 82 / 32
Регистрация: 10.08.2014
Сообщений: 420
08.06.2016, 21:50 12
Цитата Сообщение от Rius Посмотреть сообщение
(ex + e-x) / 2.
- только там не сумма, а разность.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.06.2016, 21:50

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Вычислить математическое выражение (Z=...)
Вычислить математическое выражение

Вычислить математическое выражение
Вычислить математическое выражение

Посчитать математическое выражение
Добрый день. Интересует есть ли в C# готовое решение для вычисление математического выражение. ...

Вычислить математическое выражение в строке
Допустим у нас есть строка string = &quot;2+2*2&quot; Должна вычислить это выражение с приоритетами...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.