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

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

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

Здравствуйте. Я создал программу с физ. формулами из-за научного интереса. Эта моя программа содержала мало, но серьезных багов. И вот следующая проблема - переменная _MassNow (Которая отвечает за текущую массу) принимает бесконечное положительное значение. Такое значение переменная принимает при скорости 299 792 457,99999998 м/с. И так с любой массой. Вот код :
Листинг программы
  1. Console.Clear();
  2. Console.WriteLine("Разгон ракеты до Х скорости (Все дробные числа пишутся через ",")");
  3. Console.WriteLine("Масса покоя (КГ) :");
  4. double _MassStart = Convert.ToDouble(Console.ReadLine());
  5. Console.Clear();
  6. Console.WriteLine("Разгон ракеты до Х скорости (Все дробные числа пишутся через ",")");
  7. Console.WriteLine("Масса покоя : {0} КГ", _MassStart);
  8. Console.WriteLine("Мощность двигателя (Н) :");
  9. double _Eng = Convert.ToDouble(Console.ReadLine());
  10. Console.Clear();
  11. Console.WriteLine("Разгон ракеты до Х скорости (Все дробные числа пишутся через ",")");
  12. Console.WriteLine("Масса покоя : {0} КГ", _MassStart);
  13. Console.WriteLine("Мощность двигателя : {0} Н", _Eng);
  14. Console.WriteLine("Текущая скорость (М/С) :");
  15. decimal _VelNow = Convert.ToDecimal(Console.ReadLine());
  16. Console.Clear();
  17. Console.WriteLine("Разгон ракеты до Х скорости (Все дробные числа пишутся через ",")");
  18. Console.WriteLine("Масса покоя : {0} КГ", _MassStart);
  19. Console.WriteLine("Мощность двигателя : {0} Н", _Eng);
  20. Console.WriteLine("Начальная скорость : {0} М/С", _VelNow);
  21. Console.WriteLine("Множитель точности :");
  22. double _Accuracy = Convert.ToDouble(Console.ReadLine());
  23. Console.Clear();
  24. Console.WriteLine("Разгон ракеты до Х скорости (Все дробные числа пишутся через ",")");
  25. Console.WriteLine("Масса покоя : {0} КГ", _MassStart);
  26. Console.WriteLine("Мощность двигателя : {0} Н", _Eng);
  27. Console.WriteLine("Начальная скорость : {0} М/С", _VelNow);
  28. Console.WriteLine("Множитель точности : {0}", _Accuracy);
  29. Console.WriteLine("Требуемая скорость (М/С) (Скорость света - 299 792 458 М/С) :");
  30. double _SpeedFinish = Convert.ToDouble(Console.ReadLine());
  31. Console.Clear();
  32. Console.WriteLine("Разгон ракеты до скорости {0} М/С", _SpeedFinish);
  33. Console.WriteLine("Масса корабля - {0} КГ", _MassStart);
  34. Console.WriteLine("Мощность двигателя - {0} Н", _Eng);
  35. Console.WriteLine("Начальная скорость : {0} М/С", _VelNow);
  36. Console.WriteLine("Множитель точности - {0}", _Accuracy);
  37. Console.WriteLine("========================================");
  38. Console.ReadKey();
  39. double _MassNow = _MassStart;
  40. double _C = 299792458;
  41. double _Time = 0;
  42. Random _Rnd = new Random();
  43. string _Msg = null;
  44. string _FileName = "Speed" + Convert.ToString(_Rnd.Next(0, 1000000)) + ".txt";
  45. StreamWriter _SW = new StreamWriter(_FileName, true, System.Text.Encoding.Unicode);
  46. _SW.WriteLine("Разгон ракеты до скорости {0} М/С", _SpeedFinish);
  47. _SW.WriteLine("Масса корабля - {0} КГ", _MassStart);
  48. _SW.WriteLine("Мощность двигателя - {0} Н", _Eng);
  49. _SW.WriteLine("Множитель точности - {0}", _Accuracy);
  50. _SW.WriteLine("");
  51. while (true)
  52. {
  53. for (int i = 0; i < Math.Pow(_Eng, 2)*_Accuracy; i++)
  54. {
  55. _MassNow = _MassStart / (Math.Sqrt(1 - (Math.Pow(Convert.ToDouble(_VelNow), 2) / Math.Pow(_C, 2))));
  56. double _Force = (_Eng / (Math.Pow(_Eng, 2) * _Accuracy)) / _MassNow;
  57. _VelNow = _VelNow + Convert.ToDecimal(_Force);
  58. _Time = _Time + (1 / (Math.Pow(_Eng, 2)* _Accuracy));
  59. _Msg = String.Format("M - {0:F8} КГ | V - {1:F8} М/С | T - {2:F8} С", _MassNow, _VelNow, _Time);
  60. _SW.WriteLine(_Msg);
  61. Console.WriteLine(_Msg);
  62. if (_VelNow >= Convert.ToDecimal(_SpeedFinish))
  63. {
  64. break;
  65. }
  66. }
  67. if (_VelNow >= Convert.ToDecimal(_SpeedFinish))
  68. {
  69. break;
  70. }
  71. }
  72. Console.WriteLine("========================================");
  73. Console.WriteLine("Разгон ракеты до скорости {0} М/С", _SpeedFinish);
  74. Console.WriteLine("Масса корабля - {0} КГ", _MassStart);
  75. Console.WriteLine("Мощность двигателя - {0} Н", _Eng);
  76. string _MsgLength = null;
  77. for (int i = 0; i < _Msg.Length; i++)
  78. {
  79. _MsgLength += "=";
  80. }
  81. _SW.WriteLine(_MsgLength);
  82. _SW.Close();
  83. Console.ReadKey();
Заменил я _MassNow с double на decimal, помогло, но decimal быстро переполнился и кинуло исключение. Спасибо тем, кто помог, или подсказал, в чем ошибка

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

textual
Листинг программы
  1. using System;
  2.  
  3. namespace Jesterru
  4. {
  5.     class Program
  6.     {
  7.         static void Main(string[] args)
  8.         {
  9.             decimal mass0 = 5;
  10.             decimal c = 299792458;
  11.             decimal velocity = 299792457.99999999998m;
  12.  
  13.             decimal v_to_c = (velocity * velocity) / (c * c);
  14.             decimal k = Sqrt(1 - (v_to_c), epsilon: 1e-6m);
  15.             decimal mass = mass0 / k;
  16.         }
  17.  
  18.         public static decimal Sqrt(decimal x, decimal epsilon = 0.0M)
  19.         {
  20.             if (x < 0) throw new OverflowException("Cannot calculate square root from a negative number");
  21.  
  22.             decimal current = (decimal)Math.Sqrt((double)x), previous;
  23.             do
  24.             {
  25.                 previous = current;
  26.                 if (previous == 0.0M) return 0;
  27.                 current = (previous + x / previous) / 2;
  28.             }
  29.             while (Math.Abs(previous - current) > epsilon);
  30.             return current;
  31.         }
  32.     }
  33. }

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


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

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

6   голосов , оценка 3.667 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы