C (Си): Тип float
Тип float
В прошлом уроке мы вывели таблицу перевода температур, но у нее были две проблемы:
- Значения в столбцах выглядели неровно.
- Расчеты были неточными, потому что использовались только целые числа (
int).
В этом уроке исправим обе.
Почему int недостаточно
Формула перевода:
C = (5 / 9) * (F - 32)Для F = 0 правильный результат примерно -17.78, а не -17. Чтобы получить дробную часть, нужно перейти на тип float.
Переход на float
Меняем тип рабочих переменных:
float fahr;
float celsius;
float lower;
float upper;
float step;Значения тоже удобно записывать как дробные:
lower = 0.0;
upper = 300.0;
step = 20.0;
fahr = lower;Точная формула
С float можно безопасно использовать дробные коэффициенты:
celsius = (5.0 / 9.0) * (fahr - 32.0);Так выражение считается в вещественной арифметике, без потери точности на целочисленном делении.
Форматирование вывода
Для float в printf() используем %f. Можно сразу задать ширину поля и количество знаков после запятой:
printf("%6.2f : %6.2f\n", fahr, celsius);- Значение
6задает минимальную ширину поля. - Значение
.2задает два знака после запятой. - Спецификатор
fуказывает на вещественное число.
Полная программа
#include <stdio.h>
int main(void)
{
float fahr;
float celsius;
float lower;
float upper;
float step;
lower = 0.0;
upper = 300.0;
step = 20.0;
fahr = lower;
while (fahr <= upper) {
celsius = (5.0 / 9.0) * (fahr - 32.0);
printf("%6.2f : %6.2f\n", fahr, celsius);
fahr = fahr + step;
}
return 0;
}Итоги
- Тип
floatнужен, когда важна дробная часть. - Формат
%6.2fпомогает выравнивать таблицу и ограничивать число знаков после запятой. - Вычисления с
floatдают более точный результат, чем сintв этой задаче.
Задание
Напишите программу km_to_mi, которая конвертирует километры в мили. Используйте такую формулу: мили = километры x 0.621.
Ваша программа должна использовать тип float и выводить значения в таком виде:
0.00 : 0.00
20.00 : 12.42
40.00 : 24.84
60.00 : 37.26
80.00 : 49.68
100.00 : 62.10
120.00 : 74.52
140.00 : 86.94
160.00 : 99.36
180.00 : 111.78
200.00 : 124.20
220.00 : 136.62
240.00 : 149.04
260.00 : 161.46
280.00 : 173.88
300.00 : 186.30C (Си): Тип float
Тип float
В прошлом уроке мы вывели таблицу перевода температур, но у нее были две проблемы:
- Значения в столбцах выглядели неровно.
- Расчеты были неточными, потому что использовались только целые числа (
int).
В этом уроке исправим обе.
Почему int недостаточно
Формула перевода:
C = (5 / 9) * (F - 32)Для F = 0 правильный результат примерно -17.78, а не -17. Чтобы получить дробную часть, нужно перейти на тип float.
Переход на float
Меняем тип рабочих переменных:
float fahr;
float celsius;
float lower;
float upper;
float step;Значения тоже удобно записывать как дробные:
lower = 0.0;
upper = 300.0;
step = 20.0;
fahr = lower;Точная формула
С float можно безопасно использовать дробные коэффициенты:
celsius = (5.0 / 9.0) * (fahr - 32.0);Так выражение считается в вещественной арифметике, без потери точности на целочисленном делении.
Форматирование вывода
Для float в printf() используем %f. Можно сразу задать ширину поля и количество знаков после запятой:
printf("%6.2f : %6.2f\n", fahr, celsius);- Значение
6задает минимальную ширину поля. - Значение
.2задает два знака после запятой. - Спецификатор
fуказывает на вещественное число.
Полная программа
#include <stdio.h>
int main(void)
{
float fahr;
float celsius;
float lower;
float upper;
float step;
lower = 0.0;
upper = 300.0;
step = 20.0;
fahr = lower;
while (fahr <= upper) {
celsius = (5.0 / 9.0) * (fahr - 32.0);
printf("%6.2f : %6.2f\n", fahr, celsius);
fahr = fahr + step;
}
return 0;
}Итоги
- Тип
floatнужен, когда важна дробная часть. - Формат
%6.2fпомогает выравнивать таблицу и ограничивать число знаков после запятой. - Вычисления с
floatдают более точный результат, чем сintв этой задаче.
Задание
Напишите программу km_to_mi, которая конвертирует километры в мили. Используйте такую формулу: мили = километры x 0.621.
Ваша программа должна использовать тип float и выводить значения в таком виде:
0.00 : 0.00
20.00 : 12.42
40.00 : 24.84
60.00 : 37.26
80.00 : 49.68
100.00 : 62.10
120.00 : 74.52
140.00 : 86.94
160.00 : 99.36
180.00 : 111.78
200.00 : 124.20
220.00 : 136.62
240.00 : 149.04
260.00 : 161.46
280.00 : 173.88
300.00 : 186.30Ваше упражнение проверяется по этим тестам
#include "greatest.h"
#include <unistd.h>
#include "main.c"
TEST test_base(void) {
int stdout_bk = dup(fileno(stdout));
int pipefd[2];
pipe(pipefd);
dup2(pipefd[1], fileno(stdout));
km_to_mi();
fflush(stdout);
close(pipefd[1]);
dup2(stdout_bk, fileno(stdout));
int buf_size = 10240;
char actual[buf_size];
read(pipefd[0], actual, buf_size);
char* expected =
"0.00 : 0.00\n"
"20.00 : 12.42\n"
"40.00 : 24.84\n"
"60.00 : 37.26\n"
"80.00 : 49.68\n"
"100.00 : 62.10\n"
"120.00 : 74.52\n"
"140.00 : 86.94\n"
"160.00 : 99.36\n"
"180.00 : 111.78\n"
"200.00 : 124.20\n"
"220.00 : 136.62\n"
"240.00 : 149.04\n"
"260.00 : 161.46\n"
"280.00 : 173.88\n"
"300.00 : 186.30\n";
ASSERT_STR_EQ(expected, actual);
memset(actual, 0, buf_size);
PASS();
}
GREATEST_MAIN_DEFS();
int main(int argc, char **argv) {
GREATEST_MAIN_BEGIN();
RUN_TEST(test_base);
GREATEST_MAIN_END();
}Решение учителя откроется через:
20:00
