Поговоримо про типи. Частина 3.
Минулого разу я розповідав про типи-цілі числа. На кінець замітки я запропонував написати програму, яка б реалізовувала розрахунок за якою-небудь математичною формулою. Ну от наприклад, всім відома з шкільних часів формула переміщення під час рівноприскореного руху S = v*t + a*t
#include "stdio.h"
int main() {
int a = 10, t = 5, v = 0;
printf("S = %i\n", (v*t + a*t*t/2));
return 0;
}
Відкопілювавши та виконавши цю програму отримаємо:
Для a = 10, все добре. А якщо замінити на 11, то ми мали б отримати 137,5, а ось програма поверне всього 137. Зрозуміло, що втрати дробної частини числа далеко не завжди є допустимими, тому в мові C присутні дійсні числові типи.
Дійсні числові типи в мові C
Можна виділити три дійсні числові типи: float, double,
#include "stdio.h"
int main() {
printf("float %i, double %i, long double %i\n", sizeof(float), sizeof(double), sizeof(long double));
return 0;
}
Отримаємо:
float 4, double 8, long double 12
Тип float займає 4 байти, з яких один розряд (біт) йде на знак, 7 на порядок та 24 під мантису. Аналогічно в double під порядок та мантису йде 11 та 52 розріди відповідно. А в long double 19 та 76.
Виводимо дійсні числа
Для виведення дійсних чисел на контенкст виводу через функції форматного виведення, як і цілочислені дані. Однак формат виведення буде іншим.
%f - дійсне число у вигляді десяткового дробу;
%e - у вигляді числа з фіксованою крапкою, тобто мантиси та порядку;
%g - автовибір між %f та %e, для оптимального відображення (наприклад, 10
%l - для подовження типу.
Операції з дійсними числами
Для дійсних чисел доступні всі операції, що й для цілих окрім двох: цілочислене ділення замінене на звичайне, тобто таке що повертає дійсні числа, та повністю відсутня операція залишку від ділення.
Тут хочу наголосити, що всі операції, що виконуються з дійсними числами в результаті повертають дійсні числа, а якщо всі числа цілі, то й результатом буде ціле число. Тому потрібно бути обережним при використанні дійсних та цілих чисел в одному виразі. Наведу декілька прикладів.
Вираз:
printf("%f", 1/10);
надрукує в консолі 0.000000, тому-що операції виконувались з цілими числами і виконувалось цілочислене ділення. А ось:
printf("%f %f", 1./10, 1/10.);
надрукує "0.100000 0.100000", тому що один з операндів дійсне число.
Доречі, спроба присвоїти цілій змінній результат виконання операції з дійсними числами неможливий. Потрібно використовувати приведення типів:
int i = (int) 1.5;
Модифікована програма розрахунку за формулою
На кінець хочу навести код модифікованої програми для розрахунку за формулою:
#include "stdio.h"
int main() {
float a = 11, t = 5, v = 0;
printf("S = %f\n", (v*t + a*t*t/2));
return 0;
}
Результатом ії виконання буде:
S = 137.500000
, що й треба було отримати. Пропоную всім хто слідкує за моїми дописами та виконує мої завдання спробувати модифікувати власні програми для того, щоб вони працювали з дійсними числами.
Наступного разу планую розповісти детальніше про функції введення/виведення. Слідкуйте через rss та поштову розсилку, залишайте відгуки в коментарях та мені на пошту grandse(at)ukr.net. Дякую за увагу!
Коментарі:
До речі, Ваш блог на самописній CMS?
мені здалося, що існує глюк з коментарами - Ваша регулярка не пропустила e-mail 3-го рівня mail@stopie.org.ua
Вибачте за змушений спам
Дякую за увагу до блогу, та уважне читання. Та й взагалі за те, що не полінились коментувати. Виправлю найближчим часом.



