Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
 Аватар для Jesterru
3 / 2 / 2
Регистрация: 19.06.2016
Сообщений: 299

Как избавиться от "Бесконечности"?

22.07.2017, 11:27. Показов 2259. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Я создал программу с физ. формулами из-за научного интереса. Эта моя программа содержала мало, но серьезных багов. И вот следующая проблема - переменная _MassNow (Которая отвечает за текущую массу) принимает бесконечное положительное значение. Такое значение переменная принимает при скорости 299 792 457,99999998 м/с. И так с любой массой.
Вот код :
Кликните здесь для просмотра всего текста
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
                Console.Clear();
                Console.WriteLine("Разгон ракеты до Х скорости (Все дробные числа пишутся через ",")");
                Console.WriteLine("Масса покоя (КГ) :");
                double _MassStart = Convert.ToDouble(Console.ReadLine());
                Console.Clear();
 
                Console.WriteLine("Разгон ракеты до Х скорости (Все дробные числа пишутся через ",")");
                Console.WriteLine("Масса покоя : {0} КГ", _MassStart);
                Console.WriteLine("Мощность двигателя (Н) :");
                double _Eng = Convert.ToDouble(Console.ReadLine());
                Console.Clear();
 
                Console.WriteLine("Разгон ракеты до Х скорости (Все дробные числа пишутся через ",")");
                Console.WriteLine("Масса покоя : {0} КГ", _MassStart);
                Console.WriteLine("Мощность двигателя : {0} Н", _Eng);
                Console.WriteLine("Текущая скорость (М/С) :");
                decimal _VelNow = Convert.ToDecimal(Console.ReadLine());
                Console.Clear();
 
                Console.WriteLine("Разгон ракеты до Х скорости (Все дробные числа пишутся через ",")");
                Console.WriteLine("Масса покоя : {0} КГ", _MassStart);
                Console.WriteLine("Мощность двигателя : {0} Н", _Eng);
                Console.WriteLine("Начальная скорость : {0} М/С", _VelNow);
                Console.WriteLine("Множитель точности :");
                double _Accuracy = Convert.ToDouble(Console.ReadLine());
                Console.Clear();
 
                Console.WriteLine("Разгон ракеты до Х скорости (Все дробные числа пишутся через ",")");
                Console.WriteLine("Масса покоя : {0} КГ", _MassStart);
                Console.WriteLine("Мощность двигателя : {0} Н", _Eng);
                Console.WriteLine("Начальная скорость : {0} М/С", _VelNow);
                Console.WriteLine("Множитель точности : {0}", _Accuracy);
                Console.WriteLine("Требуемая скорость (М/С) (Скорость света - 299 792 458 М/С) :");
                double _SpeedFinish = Convert.ToDouble(Console.ReadLine());
                Console.Clear();
 
                Console.WriteLine("Разгон ракеты до скорости {0} М/С", _SpeedFinish);
                Console.WriteLine("Масса корабля - {0} КГ", _MassStart);
                Console.WriteLine("Мощность двигателя - {0} Н", _Eng);
                Console.WriteLine("Начальная скорость : {0} М/С", _VelNow);
                Console.WriteLine("Множитель точности - {0}", _Accuracy);
                Console.WriteLine("========================================");
                Console.ReadKey();
 
                double _MassNow = _MassStart;
                double _C = 299792458;
                double _Time = 0;
                Random _Rnd = new Random();
                string _Msg = null;
                string _FileName = "Speed" + Convert.ToString(_Rnd.Next(0, 1000000)) + ".txt";
                StreamWriter _SW = new StreamWriter(_FileName, true, System.Text.Encoding.Unicode);
                _SW.WriteLine("Разгон ракеты до скорости {0} М/С", _SpeedFinish);
                _SW.WriteLine("Масса корабля - {0} КГ", _MassStart);
                _SW.WriteLine("Мощность двигателя - {0} Н", _Eng);
                _SW.WriteLine("Множитель точности - {0}", _Accuracy);
                _SW.WriteLine("");
 
                while (true)
                {
                    for (int i = 0; i < Math.Pow(_Eng, 2)*_Accuracy; i++)
                    {
                        _MassNow = _MassStart / (Math.Sqrt(1 - (Math.Pow(Convert.ToDouble(_VelNow), 2) / Math.Pow(_C, 2))));
                        double _Force = (_Eng / (Math.Pow(_Eng, 2) * _Accuracy)) / _MassNow;
                        _VelNow = _VelNow + Convert.ToDecimal(_Force);
                        _Time = _Time + (1 / (Math.Pow(_Eng, 2)* _Accuracy));
 
                        _Msg = String.Format("M - {0:F8} КГ | V - {1:F8} М/С | T - {2:F8} С", _MassNow, _VelNow, _Time);
                        _SW.WriteLine(_Msg);
                        Console.WriteLine(_Msg);
 
                        if (_VelNow >= Convert.ToDecimal(_SpeedFinish))
                        {
                            break;
                        }
                    }
                    if (_VelNow >= Convert.ToDecimal(_SpeedFinish))
                    {
                        break;
                    }
                }
                Console.WriteLine("========================================");
                Console.WriteLine("Разгон ракеты до скорости {0} М/С", _SpeedFinish);
                Console.WriteLine("Масса корабля - {0} КГ", _MassStart);
                Console.WriteLine("Мощность двигателя - {0} Н", _Eng);
 
                string _MsgLength = null;
                for (int i = 0; i < _Msg.Length; i++)
                {
                    _MsgLength += "=";
                }
                _SW.WriteLine(_MsgLength);
                _SW.Close();
                Console.ReadKey();

Заменил я _MassNow с double на decimal, помогло, но decimal быстро переполнился и кинуло исключение.
Спасибо тем, кто помог, или подсказал, в чем ошибка
Миниатюры
Как избавиться от "Бесконечности"?  
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.07.2017, 11:27
Ответы с готовыми решениями:

Как доказать, что тот же интеграл от минус бесконечности до бесконечности равен sqrt(pi/2)
Интеграл от нуля до бесконечность sin(x^2) dx = 1/2 sqrt (pi/2) Как доказать , что тот же интеграл от минус бесконечности до...

Как посчитать интеграл от - бесконечности до x0 и от x0 до +бесконечности
Проблема: Warning: Infinite or Not-a-Number function value encountered. &gt; In quad at 100 Warning: Infinite or Not-a-Number...

Чем отличается плюс бесконечность от минус бесконечности и от бесконечности
Чем отличается плюс бесконечность от минус бесконечности и от бесконечности?

3
Эксперт .NET
 Аватар для Rius
13153 / 7711 / 1679
Регистрация: 25.05.2015
Сообщений: 23,500
Записей в блоге: 14
22.07.2017, 11:58
Лучший ответ Сообщение было отмечено Jesterru как решение

Решение

Цитата Сообщение от Jesterru Посмотреть сообщение
Такое значение переменная принимает при скорости 299 792 457,99999998 м/с. И так с любой массой.
Напишите сами или возьмите готовые библиотеки для работы со сверхбольшими числами.
При приближении к скорости света любая масса уходит в бесконечность.
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
using System;
 
namespace Jesterru
{
    class Program
    {
        static void Main(string[] args)
        {
            decimal mass0 = 5;
            decimal c = 299792458;
            decimal velocity = 299792457.99999999998m;
 
            decimal v_to_c = (velocity * velocity) / (c * c);
            decimal k = Sqrt(1 - (v_to_c), epsilon: 1e-6m);
            decimal mass = mass0 / k;
        }
 
        public static decimal Sqrt(decimal x, decimal epsilon = 0.0M)
        {
            if (x < 0) throw new OverflowException("Cannot calculate square root from a negative number");
 
            decimal current = (decimal)Math.Sqrt((double)x), previous;
            do
            {
                previous = current;
                if (previous == 0.0M) return 0;
                current = (previous + x / previous) / 2;
            }
            while (Math.Abs(previous - current) > epsilon);
            return current;
        }
    }
}
mass == 13688326640.640771409104729815
Миниатюры
Как избавиться от "Бесконечности"?  
1
 Аватар для Jesterru
3 / 2 / 2
Регистрация: 19.06.2016
Сообщений: 299
22.07.2017, 12:23  [ТС]
Спасибо большое
0
Эксперт .NET
 Аватар для Rius
13153 / 7711 / 1679
Регистрация: 25.05.2015
Сообщений: 23,500
Записей в блоге: 14
22.07.2017, 18:39
Пример с библиотекой PeterO.Numbers, что нашлась в Nuget.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
EContext ctx = new EContext(50, ERounding.Up, -50, 50, true);
 
EDecimal mass0 = EDecimal.Create(5, 0);
EDecimal c = EDecimal.Create(299792458, 0);
EDecimal velocity = EDecimal.FromString("299792457.99999999998");
EDecimal v2 = velocity.Pow(2, ctx);
EDecimal c2 = c.Pow(2, ctx);
EDecimal v2_to_c2 = v2.Divide(c2, ctx);
 
EDecimal k = (EDecimal.Create(1, 0).Subtract(v2_to_c2, ctx));
EDecimal tau = k.Sqrt(ctx);
 
EDecimal mass = mass0.Divide(tau, ctx); // mass == {13688326641.704602455459242696331742289620724429848}
Название: mass.png
Просмотров: 70

Размер: 4.2 Кб
Когда tau стремится к zero, масса стремится к бесконечности, а время на движущемся объекте замедляется...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.07.2017, 18:39
Помогаю со студенческими работами здесь

Найти сумму от минус бесконечности до плюс бесконечности
Добрый всем вечер. Подскажите пожалуйста как правильно решать по формуле, которую приложу в скрине? Как мне найти сумму от минус...

Интервал от минус бесконечности до плюс бесконечности
uses graphABC,crt; { подключаем модуль GraphABC для работы } var A, B, x, y, x0, y0, k, i, x1, y1, r: integer; {объявления...

Как вывести символ бесконечности?
Народ, а как символ бесконечности вывести?

Как пишется знак бесконечности в маткаде?
Как пишется знак бесконечности в маткаде?

Как сделать график в виде бесконечности
Добрый день подскажите как сделать график, в виде бесконечности я не понимаю как такое можно сделать в эксель


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru