Что выведет float 21 2
Перейти к содержимому

Что выведет float 21 2

  • автор:

Арифметические действия в языке Си

Программы работают с данными. Зачастую данные представляют собой числа. В этом уроке, как вы наверное догадались, мы будем заниматься изучением того, как и что в языке Си можно делать с числами. Начнём с арифметики.

Компилятор языка Си понимает все основные арифметические операции, которые вам известны со школы. Плюс есть несколько дополнительных.

Основные арифметические операторы языка Си.

+ оператор сложения
— оператор вычитания
* оператор умножения
% оператор взятия остатка от деления
/ оператор деления

Следующая программа иллюстрирует использование первых четырёх из них. Кстати, обратите внимание на то, как с помощью функции printf вывести на экран символ % .

#include int main(void)

Результат работы этой программы представлен на следующем рисунке.

Рис.5 Использование арифметических действий в Си.

Всё чётко и понятно. Никаких неожиданностей. А теперь попробуем получить частное двух чисел. Т.к. результат должен получиться 3.5, то res объявим как float .

#include int main(void)< int a=7, b=2; float res; res = a/b; printf("%d / %d = %f\n",a,b,res); return 0; >

Как видите, результат получился не тот, что мы ожидали. Это одна из особенностей оператора деления в языке Си.

При делении значение целого типа на значение целого типа результат тоже получается целого типа.

Так уж устроен язык Си. Поэкспериментируйте, попробуйте любые другие целые числа.

Вычислить результат целочисленного деления легко. Поделите числа и отбросьте всё, что получилось в дробной части.

Пример: Как получить результат целочисленного деления

7/2 = 3.5 → 3
11/3 = 3.66 → 3
2/5 = 0.4 → 0

Для того чтобы получить тот результат, который мы в данном случае ожидаем, одно из значений нужно сделать вещественным. Сделать это проще простого. Для этого необходимо рядом с ним в скобках записать float .

Посмотрим на нашем примере:

#include int main(void)< int a=7, b=2; float res; res = (float)a/b; printf("%d / %d = %f\n",a,b,res); return 0; >

Теперь результат будет тот, что мы ожидали. Проделанный нами трюк называется явным преобразованием типа .

Явное преобразование (приведение) типа.

Если какое-то значение нужно привести к другому типу, нужно перед этим значением в скобках написать название требуемого типа.

Листинг 4. Примеры явного преобразования типа

int a=7, b; float g= 9.81,v; b = (int) g; //приводим значение 9.81 к типу int, получим 9 v= (float)a; // приводим значение 7 к типу float, получим 7.0

Важный момент: преобразуется не тип исходной переменной, а только лишь значение, которое используется в выражении. В следующем видео-фрагменте об этом говорится подробнее.

Обратите внимание, что, когда мы преобразовываем целое значение в вещественное, ничего особенного не происходит, т.к. вещественные числа включают в себя целые.

Совсем иная ситуация, когда мы от вещественного переходим к целому. При этом переходе у нас теряется вся дробная часть. Не забывайте об этом.

Картинка, показывающая различия между операциями взятие остатка, целочисленного деления и обычного деления.

Деление, целочисленное деление и остаток от деления. Отличия

Рис.2 Деление, целочисленное деление и остаток от деления.

Сохрани в закладки или поддержи проект.

Практика

Решите предложенные задачи:

Для удобства работы сразу переходите в полноэкранный режим

Исследовательские задачи для хакеров

  1. Подумайте и приведите примеры, когда обычное деление не имеет смысла. Например, деление трёх лицензионных ключей от программы между двумя людьми. Зачем кому-то нужна половина лицензионного ключа? (если, конечно, он не занимается reverse engineering).
  2. Что происходит при делении на ноль в вашей системе?

Дополнительные материалы

  1. Дополнительные задачи с автоматической проверкой решения из курса » Введение в программирование (C++) » от компании Яндекс. не беспокойтесь, что курс по С++. Удаляйте заготовку из поля для решения и спокойно вставляйте код на Си. Проверяющая система его будет нормально воспринимать.

Python: как вывести число типа float с определенным количеством знаков после запятой

Там есть много опций, для форматирования вывода, можно подробнее почитать в документации.

В вашем случае нужно в функции выводить в print не числа, а строку с форматированием, например:

>>> def vol(rad): . print(" cm^3".format(4/3*3.141592*rad**3)) >>> vol(5) 523.60 cm^3 

Еще интересные способы форматирования есть на enSO. Там немного другой вывод хотел получить автор, но можно подглядеть именно способ.

float

Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно.
Вам необходимо обновить браузер или попробовать использовать другой.

Lance_Sterling
Известный

Автор темы

Версия MoonLoader .026-beta

как мне вывести значение после точки?
например у меня float 12.032465
как сделать две цифры после точки я знаю
как мне сделать что бы отображались числа после точки, которые больше нуля?
если я отформатировал число и получилось 12.03, как мне вывести ТОЛЬКО 3?

Наглядное объяснение чисел с плавающей запятой

image

В начале 90-х создание трёхмерного игрового движка означало, что вы заставите машину выполнять почти не свойственные ей задачи. Персональные компьютеры того времени предназначались для запуска текстовых процессоров и электронных таблиц, а не для 3D-вычислений с частотой 70 кадров в секунду. Серьёзным препятствием стало то, что, несмотря на свою мощь, ЦП не имел аппаратного устройства для вычислений с плавающей запятой. У программистов было только АЛУ, перемалывающее целые числа.

При написании книги Game Engine Black Book: Wolfenstein 3D я хотел наглядно показать, насколько велики были проблемы при работе без плавающей запятой. Мои попытки разобраться в числах с плавающей запятой при помощи каноничных статей мозг воспринимал в штыки. Я начал искать другой способ. Что-нибудь, далёкое от и их загадочных экспонент с мантиссами. Может быть, в виде рисунка, потому что их мой мозг воспринимает проще.

В результате я написал эту статью и решил добавить её в книгу. Не буду утверждать, что это моё изобретение, но пока мне не приходилось видеть такого объяснения чисел с плавающей запятой. Надеюсь, статья поможет тем, у кого, как и у меня, аллергия на математические обозначения.

Как обычно объясняют числа с плавающей запятой

Цитирую Дэвида Голдберта (David Goldbert):

Для многих людей арифметика с плавающей запятой кажется каким-то тайным знанием.

Полностью с ним согласен. Однако важно понимать принципы её работы, чтобы полностью осознать её полезность при программировании 3D-движка. В языке C значения с плавающей запятой — это 32-битные контейнеры, соответствующие стандарту IEEE 754. Они предназначены для хранения и выполнения операций над аппроксимациями вещественных чисел. Пока я видел только такое их объяснение. 32 бита разделены на три части:

  • S (1 бит) для хранения знака
  • E (8 бит) для экспоненты
  • M (23 бита) для мантиссы

Внутренности числа с плавающей запятой.

Три части числа с плавающей запятой.

Пока всё нормально. Пойдём дальше. Способ интерпретации чисел обычно объясняется с помощью такой формулы:

Именно это объяснение чисел с плавающей запятой все ненавидят.

И здесь я обычно начинаю терять терпение. Возможно, у меня аллергия на математическую нотацию, но когда я это читаю, в моём мозгу ничего не «щёлкает». Такое объяснение похоже на способ рисования совы:

Другой способ объяснения

Хоть это изложение и верно, такой способ объяснения чисел с плавающей запятой обычно не даёт нам никакого понимания. Я виню эту ужасную запись в том, что она разочаровала тысячи программистов, испугала их до такой степени, что они больше никогда не пытались понять, как же на самом деле работают вычисления с плавающей запятой. К счастью, их можно объяснить иначе. Воспринимайте экспоненту как окно (Window) или интервал между двумя соседними целыми степенями двойки. Мантиссу воспринимайте как смещение (Offset) в этом окне.

Три части числа с плавающей запятой.

Окно сообщает нам, между какими двумя последовательными степенями двойки будет число: [0,1], [1,2], [2,4], [4,8] и так далее (вплоть до [,]. Смещение разделяет окно на сегментов. С помощью окна и смещения можно аппроксимировать число. Окно — это отличный механизм защиты от выхода за границы. Достигнув максимума в окне (например, в [2,4]), можно «переплыть» вправо и представить число в пределах следующего окна (например, [4,8]). Ценой этого будет только небольшое снижение точности, потому что окно становится в два раза больше.

Викторина: сколько точности теряется, когда окно закрывает больший интервал? Давайте возьмём пример с окном [0,1], в котором 8388608 смещений накладываются на интервал размером 1, что даёт нам точность . В окне [2048,4096] 8388608 смещений накладываются на интервал , что даёт нам точность .

На рисунке ниже показано, как кодируется число 6,1. Окно должно начинаться с 4 и заканчиваться следующей степенью двойки, т.е. 8. Смещение находится примерно посередине окна.

Значение 6,1 аппроксимированное с помощью числа с плавающей запятой.

Давайте возьмём ещё один пример с подробным вычислением представлением в виде числа с плавающей точкой хорошо известного всем нам значения: 3,14.

  • Число 3,14 положительно .
  • Число 3,14 находится между степенями двойки 2 и 4, то есть окно числа с плавающей запятой должно начинаться с (см. формулу, где окно — это ).
  • Наконец, есть смещений, которыми можно выразить расположение 3,14 внутри интервала [2-4]. Оно находится в внутри интервала, что даёт нам смещение
  • S = 0 = 0b
  • E = 128 = 10000000b
  • M = 4781507 = 10010001111010111000011b

Двоичное представление с плавающей точкой числа 3,14.

То есть значение 3,14 аппроксимируется как 3,1400001049041748046875.

Соответствующее значение в непонятной формуле:

И, наконец, графическое представление с окном и смещением:

Окно и смещение числа 3,14.

Интересный факт: если модули операций с плавающей запятой были такими медленными, почему в языке C в результате использовали типы float и double? Ведь в машине, на которой изобретался язык (PDP-11), не было модуля операций с плавающей запятой! Дело в том, что производитель (DEC) пообещал Деннису Ритчи и Кену Томпсону, что в следующей модели он будет. Они были любителями астрономии и решили добавить в язык эти два типа.

Интересный факт: те, кому в 1991 году действительно нужен был аппаратный модуль операций с плавающей запятой, могли его купить. Единственными, кому он мог понадобиться в то время, были учёные (по крайней мере, так Intel понимала потребности рынка). На рынке они позиционировались как «математические сопроцессоры». Их производительность была средней, а цена огромной (200 долларов 1993 года — это 350 долларов в 2016 году.). В результате уровень продаж оказался посредственным.

Надеюсь, статья была вам полезна!

  • floating point
  • числа с плавающей точкой/запятой
  • экспонента
  • мантисса

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *