3573
Алгоритми роботи з дійсними числами
Лекция
Информатика, кибернетика и программирование
Дійсні числа представляються в комп'ютері в так названої експонентної, або плаваючої, форми. Дійсне число r має вигляд
Украинкский
2012-11-03
89.5 KB
5 чел.
Алгоритми роботи з дійсними числами
Дійсні числа представляються в комп'ютері в так названої експонентної, або плаваючої, форми. Дійсне число r має вигляд
r = ±2e* m
Подання числа складається з трьох елементів:
Варто підкреслити, що ліва нерівність нестрога - мантиса може рівнятися одиниці, а права - строга, мантиса завжди менше двох. Розряди мантиси включають один розряд цілої частини, що через наведену нерівність завжди дорівнює одиниці, і фіксована кількість розрядів дробної частини. Оскільки старший двійковий розряд мантиси завжди дорівнює одиниці, зберігати його необов'язково, і у двійковому коді він відсутній. Фактично двійковий код зберігає тільки розряди дробової частини мантиси.
У мові С# дійсним числам відповідають типи float й double. Елемент типу float займає 4 байти, у яких один біт приділяється під знак, вісім - під порядок, інші 23 - під мантису (насправді, у мантисі 24 розряду, але старший розряд завжди дорівнює одиниці, тому зберігати його не потрібно). Тип double займає 8 байтів, у них один розряд приділяється під знак, 11 - під порядок, інші 52 - під мантису. Насправді в мантисі 53 розряду, але старший завжди дорівнює одиниці й тому не зберігається. Оскільки порядок може бути додатнім і відємним, у двійковому коді він зберігається в зміщеному виді: до нього додається константа, рівна абсолютній величині максимального по модулю відємного порядку. У випадку типу float вона дорівнює 127, у випадку double - 1023. Таким чином, максимальний по модулю відємний порядок представляється нульовим кодом.
Арифметичний тип із плаваючою крапкою |
|||
Ім'я типу |
Системний тип |
Діапазон |
Точність |
Float |
System.Single |
- 3. 402823e38 … + 3...402823e38 |
7 цифр |
Double |
System.Double |
- 1. 79769313486232e308... 1.79769313486232e308 |
15-16 цифр |
Основним типом є тип double, саме він найбільш природний для комп'ютера. У програмуванні треба по можливості уникати типу float, тому що його точність недостатня, а процесор однаково при виконанні операцій перетворить його в тип double. (Один з деяких випадків, де застосування типу float виправдано, - тривимірна комп'ютерна графіка.)
Кілька прикладів подання дійсних чисел у плаваючій формі:
Тут порядок дорівнює 0, мантиса - 1. У двійковому коді мантиса складається з одних нулів, тому що старший розряд мантиси (завжди одиничний) у коді відсутній. Порядок зберігається у двійковому коді в зміщеному виді, він дорівнює 127 у випадку float й 1023 у випадку double;
Порядок дорівнює одиниці, мантиса складається із трьох одиниць, з яких у двійковому коді зберігаються дві: 1100...0; зміщений порядок дорівнює 128 для float й 1024 для double;
Порядок відємний і дорівнює -1, дробова частина мантиси дорівнює 0100...0; зміщений порядок дорівнює 126 для float й 1022 для double;
Порядок дорівнює шести, дробова частина мантиси дорівнює 100100...0; зміщений порядок дорівнює 133 для float й 1029 для double.
При виконанні додавання двох додатніх плаваючих чисел відбуваються наступні дії:
Вирахування виробляється аналогічним образом. При множенні порядки складаються, а мантиси перемножуються як цілі числа, після чого в результату праві розряди відкидаються.
Дії із плаваючими числами через помилки округлення лише приблизно відбивають арифметику дійсних чисел. Так, якщо до великого плаваючого числа додати дуже маленьке, то воно не зміниться. Дійсно, при вирівнюванні порядків всі значущі біти мантиси меншого числа можуть вийти за межі розрядної сітки, у результаті чого воно стане рівним нулю. Таким чином, із плаваючими числами можлива ситуація, коли
a+b = a при b 0
Більше того, для додавання не виконується закон асоціативності:
a+(b+c) (a+b)+c
Дійсно, нехай ε - максимальне плаваюче число серед чисел, що задовольняють умові
1.0+? = 1.0
(наведені вище міркування показують, що такі числа існують). Тоді
(1.0+ε)+ε 1.0+(?+?)
оскільки ліва частина нерівності дорівнює одиниці, а права строго більше одиниці (це слідує з максимальності числа ε).
Число ε часто називають машинним эпсилоном або, менш коректно, машинним нулем, оскільки при додатку до одиниці воно поводиться як нуль. Величина машинного эпсилона характеризує точність операцій комп'ютера. Вона приблизно однакова для всіх сучасних комп'ютерів: більшість процесорів працюють із восьмибайтовими плаваючими числами (тип double у С#), а арифметика плаваючих чисел підкоряється строгим міжнародним стандартам.
Визначимо величину машинного епсилону для типу double. Число 1.0 записується в плаваючій формі як 1.0 = +20*1.0.
Порядок плаваючого числа 1.0 дорівнює нулю. При додаванні 1.0 із числом ε виконується вирівнювання порядку шляхом багаторазового зрушення мантиси числа ε вправо й збільшення його порядку на 1. Оскільки всі розряди числа ε повинні в результаті вийти за межі розрядної сітки, повинно бути виконане 53 зрушення. Порядок числа ε після цього повине стати рівним порядку числа 1.0, тобто нулю. Отже, споконвічно порядок числа ε повине бути рівним -53:
ε = 2-53*m
де m - число в діапазоні від одиниці до двох. Таким чином, величина машинного эпсилона становить приблизно
2-53 10-16
Приблизно точність обчислень становить 16 десяткових цифр. (Це також можна оцінити в такий спосіб: 53 двійкових розрядів становлять приблизно 15.95 десяткових, оскільки 53/log210 53/3.321928
15.95.)
У випадку чотирьохбайтових плаваючих чисел (тип float мови С#) точність обчислень становить приблизно 7 десяткових цифр. Це дуже мало, тому тип float надзвичайно рідко застосовується на практиці. До того ж процесор сконструйований для роботи з восьмибайтовими дійсними числами, а при роботі із чотирьохбайтовими він однаково спочатку приводить їх до восьмибайтового типу. У програмуванні варто уникати типу float і завжди користуватися типом double.
Крім втрати точності, при операціях з дійсними числами можуть відбуватися й інші неприємності:
Крім того, некоректною операцією є ділення на нуль. На відміну від операцій із цілими числами, переповнення й зникнення порядку вважаються помилковими ситуаціями й приводять до апаратного переривання роботи процесора. Програміст може задати реакцію на переривання - або аварійне завершення програми, або, наприклад, при переповненні привласнювати результату спеціальне значення плюс або мінус нескінченність, а при зникненні порядку - нуль. Помітимо, що серед двійкових кодів, що представляють плаваючі числа, є кілька спеціальних значень. Перелічимо деякі з них:
Будь-які операції з константою Na приводять до переривання, тому вона зручна при налагодженні програми - нею перед початком роботи програми ініціалуються значення всіх дійсних змінних. Якщо в результаті помилки програміста при обчисленні виразу використається змінна, котрої не було привласнено ніякого значення, то відбувається переривання через операцію зі значенням Na і помилка швидко відслідковується. На жаль, у випадку цілих чисел такої константи немає: будь-який двійковий код представляє деяке ціле число.
Дійсні константи записуються у двох формах - з фіксованою десятковою крапкою або в експонентному виді. У першому випадку крапка використається для поділу цілої й дробової частин константи. Як ціла, так і дробова частини можуть бути відсутніми. Приклади:
1.2, 0.725, 1., .35, 0.
У трьох останніх випадках відсутня або дробова, або ціла частина. Десяткова крапка повинна обов'язково бути присутня, інакше константа вважається цілою. Відзначимо, що в програмуванні саме крапка, а не кома, використається для відділення дробової частини; кома зазвичай служить для поділу елементів списку.
Експонентна форма запису дійсної константи містить знак, мантису й десятковий порядок (експоненту). Мантиса - це будь-яка позитивна речовинна константа у формі з фіксованою крапкою або цілою константою. Порядок указує степінь числа 10, на яку домножується мантиса. Порядок відокремлюється від мантиси буквою "e" (від слова exponent), вона може бути прописною або рядковою. Порядок може мати знак плюс або мінус, у випадку позитивного порядку знак плюс можна опускати. Приклади:
1.5e+6 константа еквівалентна 1500000.0
1e-4 константа еквівалентна 0.0001
-.75E3 константа еквівалентна -750.0
Задача 10.1
Написати програму: Обчислити значення функції , коли х змінюється від А до В з кроком H. Результати вивести у вигляді таблиці " № розр.- Х- У". Врахувати не значимі значення аргументу. Використати відомі методи організації циклів.
Лістинг 10.1.. З використанням циклу for
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
double a, b, h;
int i=0;
a = double.Parse(Console.ReadLine());
b = double.Parse(Console.ReadLine());
h = double.Parse(Console.ReadLine());
for (double x = a; x <= b; x = x + h)
{
i++;
if ((1 - x * x < 0) | (Math.Sin(1 - x) == 0))
{
Console.WriteLine(i + " " + x + " рішення немає ");
}
else
{
double y = Math.Sqrt(1 - x * x) / Math.Tan(1 - x);
Console.WriteLine(i + " " + x + " " + y);
} } } }}
Лістинг 10.2. З використанням циклу while
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
double a, b, h;
int i=0;
a = double.Parse(Console.ReadLine());
b = double.Parse(Console.ReadLine());
h = double.Parse(Console.ReadLine());
double x = a;
while (x<=b)
{
i++;
if ((1 - x * x < 0) | (Math.Sin(1 - x) == 0))
{
Console.WriteLine(i + " " + x + " рішення немає ");
}
else
{
double y = Math.Sqrt(1 - x * x) / Math.Tan(1 - x);
Console.WriteLine(i + " " + x + " " + y);
}
x = x + h;
}
}
}
}
Лістинг 10.4.. З використанням циклу do while
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
double a, b, h;
int i=0;
a = double.Parse(Console.ReadLine());
b = double.Parse(Console.ReadLine());
h = double.Parse(Console.ReadLine());
double x = a;
do
{
i++;
if ((1 - x * x < 0) | (Math.Sin(1 - x) == 0))
{
Console.WriteLine(i + " " + x + " рішення немає ");
}
else
{
double y = Math.Sqrt(1 - x * x) / Math.Tan(1 - x);
Console.WriteLine(i + " " + x + " " + y);
}
x = x + h;
}
while (x <= b);
}
}
}
Проаналізуйте наведені задачі, перевірте їх працездатність в середовищі програмування.
А также другие работы, которые могут Вас заинтересовать | |||
40181. | Финансовое планирование на предприятии | 35.5 KB | |
Финансовое планирование на предприятии Финансовое планирование выбор целей по реальности их достижения с имеющимися финансовыми ресурсами в зависимости от внешних условий и согласование будущих финансовых потоков выражается в составлении и контроле за выполнением планов формирования доходов и расходов учитывающих текущее финансовое состояние выраженные в денежном эквиваленте цели и средства их достижения. В рыночной экономике финансовое планирование собственной деятельности может осуществляться отдельным индивидом семьёй организацией... | |||
40182. | Принципы и методы финансового планирования | 24 KB | |
Принципы и методы финансового планирования Методы: Автоматический. Принципы: Процесс планирования должен осуществляться при использовании таких принципов как: гибкостьпостоянная адаптация к изменениям среды функционирования предприятия для чего необходима корректировка плана при различных изменениях внешней и внутренней среды непрерывность коммуникативность участие адекватность комплексность многовариантность итеративностьнеоднократная увязка уже составленных разделов планаитерации что обусловливает творческий... | |||
40183. | Бюджетирование сущность, классификация бюджетов | 35 KB | |
Бюджетирование сущность классификация бюджетов. Бюджетирование как одна из составляющих систем управления финансами интенсивно применяется во многих российских предприятиях. Смысл любой системы бюджетирования управление бюджетными данными бюджетами. Бюджет это в первую очередь план план чегото. | |||
40184. | Финансовая стратегия и тактика. Особенности фи-нансовой стратегии корпорации | 30.5 KB | |
Общепринятого точного определения что такое финансовая стратегия так до сих пор не существует но если не углубляться в теорию под этим термином понимается долгосрочная финансовая программа нацеленная на решение глобальных задач предприятия его независимости самоокупаемости и рентабельности. Финансовая стратегия состоит из следующих составляющих: финансовое планирование текущее и перспективное определяющее все источники поступления финансов и основные направления их расходования; централизация финансовых ресурсов благодаря... | |||
40185. | Корпоративный финансовый контроль. Сущность контроллинга | 31.5 KB | |
Необходимость использования контроллинга вызвано следующими причинами: 1повышение нестабильности внешней среды что вызывает повышенные требования в системе управления организации; 2необходимость увеличения скорости реакции организации на изменения внешней среды; 3необходимость наличия в организации механизма действий по обеспечению выживаемости организации и избеганию кризисных ситуаций. Конечной целью любой коммерческой организации является получение прибыли поэтому контроллинг можно назвать как система управления... | |||
40187. | Раскройте экономическую сущность финансов. Назовите и охарактеризуйте функции финансов | 67.5 KB | |
Функции: 1 Распределительная посредством финансов распределяется и перераспределяется внутренний валовой доход благодаря чему денежные средства поступают в распоряжение государства муниципалитета; 2 Контрольная заключается в их способности отслеживать весь ход распределительного процесса также расходование по целевому назначению денежных средств поступающих из федерального бюджета; 3 Регулирующая вмешательство государства в процесс воспроизводства через финансы налоги государственные кредиты и т. Финансы выполняют две... | |||
40188. | Финансовая система государства понятие, сущность, подсистемы и сферы. Место и роль финансов корпораций в финансовой системе страны | 45.5 KB | |
Место и роль финансов корпораций в финансовой системе страны. Сущность финансовой системы Процесс распределения и перераспределения стоимости совокупного общественного продукта представляет собой финансовый механизм который включает в себя систему организации регулирования и планирования финансов способов формирования и использования финансовых ресурсов у хозяйствующих субъектов наёмных работников государства и органов местного самоуправления. Структура финансовой системы В зависимости от методов формирования доходов экономических... | |||
40189. | Финансовые рынки, их функции и виды. Особенности формирования финансовых рынков в России | 62 KB | |
Для англоамериканской модели характерна ориентация на публичное размещение ценных бумаг и высокий уровень развития вторичного рынка который по объему значительно больше вторичного рынка стран континентальной Европы. Главный инструмент страхового сегмента финансового рынка договор между страхователем и страховщиком. Под производными финансовыми инструментами обычно понимаются фьючерсные опционные и иные стандартные биржевые контракты а также форвардные опционные и иные срочные сделки внебиржевого рынка. Финансовые инструменты денежного... | |||