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