Расширяем границы машинных нуля, эпсилона и бесконечности - C#
Формулировка задачи:
Задание:
Написать на C# программу, которая позволит определить: машинный ноль,
машинную бесконечность, машинное эпсилон.
Теория:
Примем следующие способы определения приближенных значений
параметров, требуемых в задаче:
1. Положим , где n - первое натуральное число, при котором
происходит переполнение.
2. Положим , где m – первое натуральное число , при котором
совпадает с нулем.
3. Положим , где k – наибольшее натуральное число, при котором
сумма вычисленного значения 1+ еще больше 1. Фактически есть
граница относительной погрешности представления числа .
Результаты вычислительного эксперимента:
Машинная бесконечность ≈ X^(307)
Машинный нуль ≈ X^(-306)
Машинное эпсилон ≈ X^(-15)
Что было сделано:
1) Мною была создана форма: 3 ListBox-а, и 3 Label-а(для подписи этих самых ListBox-ов);
2) Был написан программный код, вот он:
3) Программа была откомпилирована, синтаксические ошибки не обнаружились.
4) Программа запустилась и выдала вот такую картину:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { double a=1; int n = 1; //Машинный ноль: while (a != 0) { a = Math.Pow(10, -n); listBox1.Items.Add(Convert.ToString("Cтепень n = -" + n + " Число: " + a)); ++n; } --n; listBox1.Items.Add(Convert.ToString(@"-\-\-\-\-\-\-\-\-\-\-\-")); listBox1.Items.Add(Convert.ToString("МАШИННЫЙ НОЛЬ: 10^(-" + n + ")")); // Машинный эпсилон: a = 1; n = 1; while (a + 1 > 1) { a = Math.Pow(10, -n); listBox2.Items.Add(Convert.ToString("Проверяю степень n = -"+ n + " Число: " + a)); ++n; } --n; a = Math.Pow(10, -n); listBox2.Items.Add(Convert.ToString("МАШИННЫЙ ЭПСИЛОН: 10^(-" + n + ")")); //Машинная бесконечность: a = 1; n = 1; while( System.Double.IsInfinity(a) != true ) { a = Math.Pow(10, n); listBox3.Items.Add(Convert.ToString("Проверяю степень n = " + n + " Число: " + a)); ++n; } --n; a = Math.Pow(10, n); listBox3.Items.Add(Convert.ToString("МАШИННАЯ БЕСКОНЕЧНОСТЬ: 10^(" + n + ")")); } } }
Машинная бесконечность: 10^(309)
Машинный нуль: 10^(-324)
Машинное эпсилон: 10^(-16)
И теперь, уважаемые программисты (и другие люди, которые понимают что произошло) я хочу получить ответы на такие вопросы:
а) Программа правильно написана?
б) Что я сделал не правильно?
в) А что, собственно, происходит? Решение задачи: «Расширяем границы машинных нуля, эпсилона и бесконечности»
textual
Листинг программы
/// <summary> /// Представляет наименьшее положительное значение <see cref="T:System.Double"/> больше нуля. Это поле является константой. /// </summary> /// <filterpriority>1</filterpriority> [__DynamicallyInvokable] public const double Epsilon = 4.94065645841247E-324;
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д