Типы данных
Вывод действительных чисел на C++ Перед выводом действительных чисел (float, double, long double) следует указать выходному потоку точность вывода. Например:
float x; x = 123.456789; cout.setf(ios::fixed); // вывод в фиксированном формате cout.precision(6); // вывод до 6 знака после точки, включительно cout
Вы используете гостевой доступ (Вход)
Эта страница: General type: incourse. Context Страница: Вывод действительных чисел на C++ (context id 276028). Page type mod-page-view.
Действительные числа
Ранее рассматривался только один тип целочисленных переменных — int . На самом деле существует несколько основных целочисленных типов, тип int — лишь один (но наиболее часто используемый) из них.
Таблица основных целочисленных типов.
| Название | Размер | Знаковый | Синонимы |
|---|---|---|---|
| short | 2 байта | Знаковый | short int , signed short , signed short int |
| unsigned short | 2 байта | Беззнаковый | unsigned short int |
| int | 4 байта | Знаковый | signed int |
| unsigned | 4 байта | Беззнаковый | unsigned int |
| long | 4 байта | Знаковый | long int , signed long , signed long int |
| unsigned long | 4 байта | Беззнаковый | unsigned long int |
| long long | 8 байт | Знаковый | long long int , signed long long , signed long long int |
| unsigned long long | 8 байт | Беззнаковый | unsigned long long int |
То есть типы бывают “короткими” ( short ), обычными, длинными ( long ) и очень длинными ( long long ). Последний тип является расширением компилятора GNU C++ и не является стандартным типом для языка C++, поэтому он может отсутствовать в других реализациях языка или называться по-другому (например, в компиляторе Microsoft Visual C++ аналогичный тип называется int64 ). Чем “длиннее” тип, тем большее число различных значений он может принимать, тем больше памяти он занимает. Также типы бывают знаковыми ( signed ), которые могут принимать как положительные, так и отрицательные значения и беззнаковые ( unsigned ), которые принимают только неотрицательные значения.
Таблица значений, которые могут принимать различные типы:
| Название | Размер | Минимальное значение | Максимальное значение |
|---|---|---|---|
| short | 16 бит | -2 15 =- 32768 | 2 15 -1 = 32767 |
| unsigned short | 16 бит | 0 | 2 16 -1 = 65535 |
| int , long | 32 бита | -2 31 = -2147483648 | 2 31 -1 = 2147483647 |
| unsigned , unsigned long | 32 бита | 0 | 2 32 -1 = 4294967295 |
| long long | 64 бита | -2 63 = -9223372036854775808 | 2 63 -1 = 9223372036854775807 |
| unsigned long long | 64 бита | 0 | 2 64 -1 = 18446744073709551615 |
На самом деле в стандарте языка C++ не оговорены конкретные значения размеров типов. Оговорено только то, что одинаковые знаковые и беззнаковые типы имеют одинаковые размеры, и размер меньшего типа всегда не превосходит размера большего типа. Вот какие размеры могут быть у этих типов в зависимости от разрядности процессора компьютера:
| Тип | 16-битный процессор | 32-битный процессор | 64-битный процессор |
|---|---|---|---|
| short | 2 байта | 2 байта | 2 байта |
| int | 2 байта | 4 байта | 4 байта |
| long | 4 байта | 4 байта | 8 байт |
| long long | — | 8 байт | 8 байт |
Действительные типы
Действительные (вещественные) числа представляются в виде чисел с десятичной точкой (а не запятой, как принято при записи десятичный дробей в русский текстах). Для записи очень больших или очень маленьких по модулю чисел используется так называемая запись “с плавающей точкой” (также называемая “научная” запись). В этом случае число представляется в виде некоторой десятичной дроби, называемой мантиссой, умноженной на целочисленную степень десяти (порядок). Например, расстояние от Земли до Солнца равно 1.496·10 11 , а масса молекулы воды 2.99·10 -23 .
Числа с плавающей точкой в программах на языке C++, а также при вводы и выводе записавыются в виде мантиссы, затем пишется буква e , затем пишется порядок. Пробелы внутри этой записи не ставятся. Например, указанные выше константы можно записать в виде 1.496e11 и 2.99e-23 . Перед самим числом также может стоять знак минус.
Для представления в памяти ЭВМ действительных чисел существует три типа:
| Тип | Точность | Размер | Количество знаков мантиссы | Минимальное положительное значение | Максимальное значение |
|---|---|---|---|---|---|
| float | Одинарная | 4 байта | 7 | 1.4e-45 | 3.4e38 |
| double | Двойная | 8 байт | 15 | 5.0e-324 | 1.7e308 |
| long double | Расширенная | 10 байт | 19 | 1.9e-4951 | 1.1e4932 |
Операция деления
Для действительных чисел определены операции сложения, вычитания, умножения и деления.
При этом операция деления выполняется по-разному для переменных и констант целочисленного типа и для переменных и констант действительных типов. В первом случае деление производится нацело с отбрасыванием дробной части, во втором случае — деление производится точно и результатом является действительное число. Более точно, если делимое и делитель одновременно являются целочисленными константами или переменными целочисленных типов, то деление будет целочисленным, а если хотя бы одно из них действительное, то деление будет действительным. Например:
coutвыведет 3 в первой строке и 3.33333 в остальных строках.
Результат выполнения деления не зависит от того, какой переменной будет присвоен результат. Если написать double a = 10 / 3; , то переменная a будет равна 3, так как деление 10/3 будет целочисленным, независимо от того, чему будет присвоен результат.
Приведение типов
Иногда возникает необходимость привести выражение одного типа к такому же выражению другого типа. Например, если есть две переменные a и b типа int и требуется вычислить их частное (не целочисленное) и записать в переменную d типа double . Следующий код:
double d; d = a / bбудет неверным, т.к. деление a / b будет целочисленным. Правильный код такой:
double d; d = (double)a / b;В этом примере используется операция приведения типа: (double)a . Эта операция возвращает значение типа double , но равное значению переменной a . В результате деление будет выполняться, как деление вещественных чисел, поскольку будет выполняться деление действительного значения на целочисленное.
Операция приведения типа не меняет тип самой переменной и ее значение, а только возвращает значение другого типа.
Упражнение
Определите, чему будут равны следующие переменные
int a = 13 / 5; int b = 13 % 5; int c = 13.0 / 5; double d = 13 / 5; double e = 13 % 5; double f = 13.0 / 5; double g = 13 / 5 + 2 / 5; double h = 13.0 / 5 + 2.0 / 5; int i = 13.0 / 5 + 2.0 / 5;Список функций
В стандартную математическую библиотеку языка Си (а, значит, и C++) входит множество специальных математических функций, которые нужно знать и уметь использовать. Для того, чтобы использовать эти функции в своей программе, необходимо подключить заголовочный файл, содержащий описания этих функций, что делается строчкой в начале программы:
#include
Функция от одного аргумента вызывается, например, так: sin(x) . Вместо числа x может быть любое число, переменная или выражение. Функция возращает значение, которое можно вывести на экран, присвоить другой переменной или использовать в выражении:
y = sin(x); coutТакже в файле cmath есть набор полезных числовых констант, например, константа M_PI хранит значение числа \(\pi\).
В компиляторе Visual C++ для использования этих констант необходимо объявить директиву препроцессора _USE_MATH_DEFINES перед подключения заголовочного файла cmath .
#define _USE_MATH_DEFINES #includeТочность вывода
По умолчанию действительные числа выводятся с точностью в 6 знаков, но в переменной типа double числа храняться с точностью в 15-16 знаков. Для того, чтобы вывести число с большей точностью, например, с точностью в 15 знаков, нужно выполнить команду:
cout.precision(15);Как на СИ преобразовать вводимое дробное или целое число в внутренний формат(спт/сфт) и вывести его?
Здравствуйте, как мне преобразовать на си число(дробное. целое) в внутренний формат(спт/сфт). Мне нужно реализовать известный алгоритм преобразования, но пока у меня не получается. Я накидал шаблон, но дальше пока не могу двигаться. Спасибо большое.
#include #include . . . unsigned char representation[sizeof(float)]; float x = 76.625; memcpy(representation, &x, sizeof(x)); for (int i = sizeof(x) - 1; i >= 0; i--) < unsigned char byteRep = representation[i]; //0..255 //перевести это число в 16-сс и вывести, можно по 2-м цифрам >
- Вопрос задан более трёх лет назад
- 1551 просмотр
Комментировать
Решения вопроса 1
"I'm here to consult you" © Dogbert
как мне преобразовать на си число(дробное. целое) в внутренний формат(спт/сфт)
Что такое спт/сфт? С Плавающей Точкой -> С Фиксированной Точкой?
Просто умножить на 2^(количество битов в дробной части представления с фиксированной точкой) и взять целую часть от результата. Например, для представления с фиксированной точкой 16.16:
float x = 76.625; uint32_t fix = (int32_t)(x * (1
Вывести его проще всего приведя к типу float и поделив на 2 ^ (количество битов в дробной части представления с фиксированной точкой):
printf("%f\n", (float)fix / (1
Ответ написан более трёх лет назад
Нравится 1 1 комментарий
mr_firuzinho @mr_firuzinho Автор вопроса
как мне преобразовать на си число(дробное. целое) в внутренний формат(спт/сфт)
Т.е как именно преобразовать в число с плавающей точкой и, как это же самое число в чисто с фиксированной точкой
Ответы на вопрос 1
Developer, ex-admin
Не понял то такое спт/сфт.
Но в функциях printf есть спецификаторы для вывода в 16-сс.
Если вручную, то я бы завел массив из 16 элементов char, куда записал шестнадцатиричные цифры, потом берете половину байта как индекс массива и строите строку из элементов массива.
Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
Ваш ответ на вопрос
Войдите, чтобы написать ответ

- C++
- +1 ещё
В чем ошибка кода?
- 1 подписчик
- 12 часов назад
- 106 просмотров
C++ Пользователь вводит с клавиатуры дробное число. Округлить его до двух знаков после запятой и вывести.
Пробовал вот таким образом, но в консоль выводится только целая часть. Не пойму почему.
int DROBi = int(DROB); // 33
double DROBs = DROB * 100; // 3344.55
int DROBe = int(DROBs); // 3344
double DROBee = DROBe / 100; // 33.44
int DROBeee = int(DROBee); // 33
double DROBeeee = DROBee - DROBeee; // 0.44
double DROBie = DROBi + DROBeeee; // 33.44
Лучший ответ
double DROBee = DROBe / 100.; // попробуй просто поставить точку после 100
hmoff1711Профи (603) 4 года назад
Это сработало! Спасибо! А как это работает? Для чего это точка?
Miku Hatsune Мудрец (11157) Потому что когда делишь целое на целое - получаешь целое Делишь целое на число с плавающей точкой - получаешь число с плавающей точкой
Остальные ответы
#include "iostream"
#include "iomanip"
using namespace std;
int main()>f; cout
. Гений (84746) 4 года назад
Если не выберут этот ответ - даже я расстроюсь =)
hmoff1711 Профи (603) я так понимаю, фиксированная точка и setprecision() выбор точки?
hmoff1711Профи (603) 4 года назад
а что означает fixed << setprecision(2) ?
Miku Hatsune Мудрец (11157) Значит, что числа выводятся 1.В десятичной форме 2.С точностью до двух знаков после точки
Похожие вопросы
Ваш браузер устарел
Мы постоянно добавляем новый функционал в основной интерфейс проекта. К сожалению, старые браузеры не в состоянии качественно работать с современными программными продуктами. Для корректной работы используйте последние версии браузеров Chrome, Mozilla Firefox, Opera, Microsoft Edge или установите браузер Atom.