Расширяем границы машинных нуля, эпсилона и бесконечности - C#

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

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

Задание: Написать на C# программу, которая позволит определить: машинный ноль, машинную бесконечность, машинное эпсилон. Теория: Примем следующие способы определения приближенных значений параметров, требуемых в задаче: 1. Положим , где n - первое натуральное число, при котором происходит переполнение. 2. Положим , где m – первое натуральное число , при котором совпадает с нулем. 3. Положим , где k – наибольшее натуральное число, при котором сумма вычисленного значения 1+ еще больше 1. Фактически есть граница относительной погрешности представления числа . Результаты вычислительного эксперимента: Машинная бесконечность ≈ X^(307) Машинный нуль ≈ X^(-306) Машинное эпсилон ≈ X^(-15) Что было сделано: 1) Мною была создана форма: 3 ListBox-а, и 3 Label-а(для подписи этих самых ListBox-ов); 2) Был написан программный код, вот он:
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 + ")"));
 
        }
    }
}
3) Программа была откомпилирована, синтаксические ошибки не обнаружились. 4) Программа запустилась и выдала вот такую картину:
Машинная бесконечность: 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;

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


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

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

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