в чем разница между float и double c
Разница между float и double в C / C ++
float — это 32-разрядный бит IEEE 754 с плавающей запятой с одинарной точностью Number1 для знака (8 бит для показателя степени и 23 * для значения), т. е. float имеет 7 десятичных знаков точности.
double — это 64-битное число с плавающей точкой двойной точности IEEE 754 (1 бит для знака, 11 бит для показателя степени и 52 * бит для значения), т. е. double имеет 15 десятичных знаков точности.
Давайте рассмотрим пример (пример взят здесь ):
Для квадратного уравнения x2 — 4.0000000 x + 3.9999999 = 0 точные корни из 10 значащих цифр: r1 = 2.000316228 и r2 = 1.999683772
// C программа для демонстрации
// двойные и плавающие значения точности
// функция полезности, которая вычисляет корни
// квадратное уравнение с использованием двойных значений
void double_solve( double a, double b, double c)<
double r1 = (-b + sd) / (2.0*a);
// функция полезности, которая вычисляет корни
// квадратное уравнение с использованием значений с плавающей запятой
void float_solve( float a, float b, float c)<
float r1 = (-b + sd) / (2.0f*a);
float fc = 3.9999999f;
double dc = 3.9999999;
printf ( «for float values: \n» );
float_solve(fa, fb, fc);
printf ( «for double values: \n» );
double_solve(da, db, dc);
Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.
Типы данных для C#: минимум, который необходимо знать
Содержание статьи:
Введение
Типы данных используются для управления переменными. Каждый из типов данных обрабатывается в соответствии с определенными правилами. Поскольку C# — язык со строгой типизацией, то абсолютно все выполняемые операции проверяются на соответствие типов (во избежание ошибок производится их предварительный контроль). Если какая-либо операция с типами недопустима, итоговая программа не будет скомпилирована. По сути, разработка программного обеспечения на C# представляет собой создание и организацию взаимодействия между различными типами данных.
В языке C# типы данных имеют две категории:
Подразделение типов значения
Подразделение ссылочных типов
Использование суффиксов float, decimal, double
У некоторых числовых типов имеются суффиксы, позволяющие записывать значение типа в переменную.
Числовые типы с плавающей запятой — это действительные числа. Они принадлежат к категории Типы значения. Это простые типы, которые могут быть инициализированы литералами. Они поддерживают операторы сравнения, равенства и арифметические операторы.
Тип C# | Диапазон | Точность/Знаков после запятой | Размер/байт | Системный тип |
float | ±1,5 x 10-45…±3,4 x 1038 | 6-9 | 4 | System.Single |
double | ±5,0 × 10-324…±1,7 × 10308 | 15-17 | 8 | System.Double |
decimal | ±1,0 x 10-28…±7,9228 x 1028 | 28-29 | 16 | System.Decimal |
Ключевые слова из колонки Тип C# взаимозаменяемы с системными типами.
С# decimal VS double
Литералы
Тип определяется суффиксом:
Decimal и float
Decimal и float используются для хранения числовых значений:
C# convert to decimal
Класс convert создан для того, чтобы преобразовывать широкий спектр типов. С его помощью можно преобразовывать в десятичное число больше типов. Метод Convert.ToDecimal используется для преобразования строкового представления числа в эквивалентное десятичное число с информацией о форматировании.
Вывод: преобразование в десятичное значение указанных строк:
123456789, 12345.6789, 123456789.0123.
C# decimal to int
Метод Decimal.ToInt32() создан для преобразования decimal значения в эквивалентное 32-разрядное целое число со знаком.
C# decimal round
Decimal.Round() или С# round decimal представляет собой метод округления к ближайшему целому числу или указанному количеству десятичных знаков.
Вывод: округленное значение 184467440737096.
2 Round(Decimal, Int32) Method — округление значения Decimal до указанного количества десятичных знаков;
3 Round(Decimal, Int32, MidpointRounding) Method ;
Таблица некоторых типов C# и их сочетание с системными типами
Название встроенного типа (столбец Ключевое слово) — и есть сокращенное обозначение системного типа (столбец Системный тип).
Неявная типизация
Но такие переменные имеют свои ограничения:
1 Нельзя определить неявную переменную и сразу ее инициализировать.
Double или format decimal C#?
После запятой decimal может иметь до 28 цифр, тогда как double — до 16. Тем не менее double широко используется в математических вычислениях, а decimal — в финансовых.
Таблица различий между double и decimal
Максимальное значение | Минимальное значение | Цифр после запятой | Размер | Количество операций |
double | 16 | 8 байт | миллиарды в секунду | |
decimal | 10-28 | 28 | 16 байт | сотни миллионов в секунду |
Типы данных могут быть простыми и сложными. Сложные типы чаще всего данные структурируют, а у простых значения данных неделимы. Любой язык программирования имеет систему встроенных типов данных, на их основе можно создавать свои производные.
В C# типы данных подразделяются на две большие группы:
Закрепить материал по типам C#-данных можно на основе этого замечательного видео, где дополняется все сказаное нами:
Одинарная или двойная точность?
Введение
Статья также написана для тех из вас, у кого много данных. Если вам требуется несколько чисел тут или там, просто используйте double и не забивайте себе голову!
Точность данных
У 32-битных чисел с плавающей запятой точность примерно 24 бита, то есть около 7 десятичных знаков, а у чисел с двойной точностью — 53 бита, то есть примерно 16 десятичных знаков. Насколько это много? Вот некоторые грубые оценки того, какую точность вы получаете в худшем случае при использовании float и double для измерения объектов в разных диапазонах:
Почему всегда не хранить всё с двойной точностью?
Влияние на производительность вычислений с одинарной и двойной точностью
Когда производить вычисления с увеличенной точностью
Даже если вы храните данные с одинарной точностью, в некоторых случаях уместно использовать двойную точность при вычислениях. Вот простой пример на С:
Если вы запустите этот код на десяти числах одинарной точности, то не заметите каких-либо проблем с точностью. Но если запустите на миллионе чисел, то определённо заметите. Причина в том, что точность теряется при сложении больших и маленьких чисел, а после сложения миллиона чисел, вероятно, такая ситуация встретится. Практическое правило такое: если вы складываете 10^N значений, то теряете N десятичных знаков точности. Так что при сложении тысячи (10^3) чисел теряются три десятичных знака точности. Если складывать миллион (10^6) чисел, то теряются шесть десятичных знаков (а у float их всего семь!). Решение простое: вместо этого выполнять вычисления в формате double :
Пример
Предположим, что вы хотите точно измерить какое-то значение, но ваше измерительное устройство (с неким цифровым дисплеем) показывает только три значимых разряда. Измерение переменной десять раз выдаёт следующий ряд значений:
Чтобы увеличить точность, вы решаете сложить результаты измерений и вычислить среднее значение. В этом примере используется число с плавающей запятой в base-10, у которого точность составляет точно семь десятичных знаков (похоже на 32-битный float ). С тремя значимыми разрядами это даёт нам четыре дополнительных десятичных знака точности:
В сумме уже четыре значимых разряда, с тремя свободными. Что если сложить сотню таких значений? Тогда мы получим нечто вроде такого:
Всё ещё остались два неиспользованных разряда. Если суммировать тысячу чисел?
Пока что всё хорошо, но теперь мы используем все десятичные знаки для точности. Продолжим складывать числа:
Заметьте, как мы сдвигаем меньшее число, чтобы выровнять десятичный разделитель. У нас больше нет запасных разрядов, и мы опасно приблизились к потере точности. Что если сложить сто тысяч значений? Тогда добавление новых значений будет выглядеть так:
Обратите внимание, что последний значимый разряд данных (2 в 3.12) теряется. Вот теперь потеря точности действительно происходит, поскольку мы непрерывно будем игнорировать последний разряд точности наших данных. Мы видим, что проблема возникает после сложения десяти тысяч чисел, но до ста тысяч. У нас есть семь десятичных знаков точности, а в измерениях имеются три значимых разряда. Оставшиеся четыре разряда — это четыре порядка величины, которые выполняют роль своеобразного «числового буфера». Поэтому мы можем безопасно складывать четыре порядка величины = 10000 значений без потери точности, но дальше возникнут проблемы. Поэтому правило следующее:
(Существуют численно стабильные способы сложения большого количества значений. Однако простое переключение с float на double гораздо проще и, вероятно, быстрее).
Выводы
Приложение: Что такое число с плавающей запятой?
Я обнаружил, что многие на самом деле не вникают, что такое числа с плавающей запятой, поэтому есть смысл вкратце объяснить. Я пропущу здесь мельчайшие детали о битах, INF, NaN и поднормалях, а вместо этого покажу несколько примеров чисел с плавающей запятой в base-10. Всё то же самое применимо к двоичным числам.
Вот несколько примеров чисел с плавающей запятой, все с семью десятичными разрядами (это близко к 32-битному float ).
1.875545 · 10^-18 = 0.000 000 000 000 000 001 875 545
3.141593 · 10^0 = 3.141593
2.997925 · 10^8 = 299 792 500
6.022141 · 10^23 = 602 214 100 000 000 000 000 000
Выделенная жирным часть называется мантиссой, а выделенная курсивом — экспонентой. Вкратце, точность хранится в мантиссе, а величина в экспоненте. Так как с ними работать? Ну, умножение производится просто: перемножаем мантисссы и складываем экспоненты:
Сложение немного хитрее: чтобы сложить два числа разной величины, сначала нужно сдвинуть меньшее из двух чисел таким образом, чтобы запятая находилась в одном и том же месте.
Заметьте, как мы сдвинули некоторые из значимых десятичных знаков, чтобы запятые совпадали. Другими словами, мы теряем точность, когда складываем числа разных величин.
Встроенные типы (C++)
Встроенные типы (также называемые фундаментальными типами) задаются стандартом языка C++ и встроены в компилятор. Встроенные типы не определены в файле заголовка. Встроенные типы делятся на три основные категории: целые, с плавающей запятойи void. Целочисленные типы представляют целые числа. Типы с плавающей запятой могут указывать значения, которые могут содержать дробные части. Большинство встроенных типов рассматриваются компилятором как отдельные типы. Однако некоторые типы являются синонимамиили обрабатываются компилятором как эквивалентные типы.
Тип void
в операторе выражения (Дополнительные сведения см. в разделе выражения.)
в левом операнде оператора запятой (Дополнительные сведения см. в разделе оператор-запятая.)
std:: nullptr_t
Тип Boolean
Символьные типы
Зависящие от Майкрософт: переменные типа помещаются в int тип по signed char умолчанию, если не /J используется параметр компиляции. В этом случае они рассматриваются как тип unsigned char и переносятся в int без расширения знака.
Переменная типа wchar_t является расширенным символом или типом многобайтового символа. Используйте L префикс перед символьным или строковым литералом, чтобы указать тип расширенных символов.
char16_t Тип используется для символьного представления UTF-16. Он должен быть достаточно большим, чтобы представлять любой блок кода UTF-16. Компилятор обрабатывает его как отдельный тип.
char32_t Тип используется для символьного представления UTF-32. Он должен быть достаточно большим, чтобы представлять любую единицу кода UTF-32. Компилятор обрабатывает его как отдельный тип.
Типы с плавающей запятой
Типы с плавающей запятой используют представление IEEE-754, чтобы обеспечить приближение дробных значений к широкому диапазону величин. В следующей таблице перечислены типы с плавающей запятой в C++ и сравнительные ограничения размеров типов с плавающей запятой. Эти ограничения задаются стандартом C++ и не зависят от реализации Майкрософт. Абсолютный размер встроенных типов с плавающей запятой не указан в стандарте.
Конкретно для Майкрософт: представление и double идентично. Однако long double double компилятор обрабатывает как отдельные типы. Компилятор Microsoft C++ использует 4-и 8-байтовые представления с плавающей запятой в формате IEEE-754. Дополнительные сведения см. в разделе IEEE с плавающей точкой.
Целочисленные типы
int Тип является базовым целочисленным типом по умолчанию. Он может представлять все целые числа в диапазоне, зависящем от реализации.
Представление целого числа со знаком — это одно из значений, которое может содержать положительные и отрицательные значения. Он используется по умолчанию или при signed наличии ключевого слова модификатор. unsigned Ключевое слово модификатор задает unsigned представление, которое может содержать только неотрицательные значения.
Реализация должна поддерживать как минимальные требования к размеру, так и отношение размера для каждого типа. Однако фактические размеры могут и зависеть от реализации. См. раздел размеры встроенных типов для деталей реализации, связанных с Майкрософт.
int Ключевое слово можно опустить, если signed unsigned заданы модификаторы, или. Модификаторы и int тип, если они есть, могут использоваться в любом порядке. Например, short unsigned и unsigned int short следует ссылаться на один и тот же тип.
Синонимы целочисленного типа
Компилятор считает синонимами следующие группы типов:
Размеры встроенных типов
Большинство встроенных типов имеют размеры, определенные реализацией. В следующей таблице перечислены объемы хранилища, необходимые для встроенных типов в Microsoft C++. В частности, long имеет 4 байта даже в 64-разрядных операционных системах.
Дополнительные сведения о преобразовании типов см. в разделе стандартные преобразования.
Урок №33. Типы данных с плавающей точкой: float, double и long double
Обновл. 11 Сен 2021 |
Типы данных с плавающей точкой
Есть три типа данных с плавающей точкой: float, double и long double. Язык C++ определяет только их минимальный размер (как и с целочисленными типами). Типы данных с плавающей точкой всегда являются signed (т.е. могут хранить как положительные, так и отрицательные числа).
Тип | Минимальный размер | Типичный размер | |
Тип данных с плавающей точкой | float | 4 байта | 4 байта |
double | 8 байт | 8 байт | |
long double | 8 байт | 8, 12 или 16 байт |
Объявление переменных разных типов данных с плавающей точкой:
Если нужно использовать целое число с переменной типа с плавающей точкой, то тогда после этого числа нужно поставить разделительную точку и нуль. Это позволяет различать переменные целочисленных типов от переменных типов с плавающей запятой:
Обратите внимание, литералы типа с плавающей точкой по умолчанию относятся к типу double. f в конце числа означает тип float.
Экспоненциальная запись
Обычно, в экспоненциальной записи, в целой части находится только одна цифра, все остальные пишутся после разделительной точки (в дробной части).
На практике экспоненциальная запись может использоваться в операциях присваивания следующим образом: