Расширяем границы машинных нуля, эпсилона и бесконечности - 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;