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

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Я создал программу с физ. формулами из-за научного интереса. Эта моя программа содержала мало, но серьезных багов. И вот следующая проблема - переменная _MassNow (Которая отвечает за текущую массу) принимает бесконечное положительное значение. Такое значение переменная принимает при скорости 299 792 457,99999998 м/с. И так с любой массой. Вот код :
                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 быстро переполнился и кинуло исключение. Спасибо тем, кто помог, или подсказал, в чем ошибка

Решение задачи: «Как избавиться от "Бесконечности"?»

textual
Листинг программы
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;
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.667 из 5
Похожие ответы