Поговоримо про типи. Частина 3.

Опубліковано: 2008-12-21   12:07:18

C/C++Минулого разу я розповідав про типи-цілі числа. На кінець замітки я запропонував написати програму, яка б реалізовувала розрахунок за якою-небудь математичною формулою. Ну от наприклад, всім відома з шкільних часів формула переміщення під час рівноприскореного руху S = v*t + a*t2/2. Сподіваюсь, що труднощів таке завдання не викликає та одразу ж приведу програмний код без пояснен:

#include "stdio.h" int main() { int a = 10, t = 5, v = 0; printf("S = %i\n", (v*t + a*t*t/2)); return 0; }

Відкопілювавши та виконавши цю програму отримаємо:

S = 125

Для a = 10, все добре. А якщо замінити на 11, то ми мали б отримати 137,5, а ось програма поверне всього 137. Зрозуміло, що втрати дробної частини числа далеко не завжди є допустимими, тому в мові C присутні дійсні числові типи.

Дійсні числові типи в мові C

Можна виділити три дійсні числові типи: float, double, long 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-10 при %f роздрукується як 0.000000, а 1.000000e-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. Дякую за увагу!

Теги: C/C++
Коментарі: 3
 

Коментарі:

stopie2009-01-03 17:40:52 :

Виправте назву посту

Пговоримо про типи = Поговоримо про типи

 
stopie2009-01-03 17:46:15 :

До речі, Ваш блог на самописній CMS?

мені здалося, що існує глюк з коментарами - Ваша регулярка не пропустила e-mail 3-го рівня mail@stopie.org.ua

Вибачте за змушений спам

 
GrAndSE2009-01-06 12:00:19 :

Дякую за увагу до блогу, та уважне читання. Та й взагалі за те, що не полінились коментувати. Виправлю найближчим часом.

 

Додати коментар

user

email

url

text

Повідомляти про новікоментарі