Float и double — какой из них я должен использовать? 2020

Характеристики типов с плавающей запятойCharacteristics of the floating-point types

C# поддерживает следующие предварительно определенные типы с плавающей запятой:C# supports the following predefined floating-point types:

Ключевое слово или тип C#C# type/keyword Приблизительный диапазон значенийApproximate range ТочностьPrecision РазмерSize Тип .NET.NET type
От ±1,5 x 10−45 до ±3,4 x 1038±1.5 x 10−45 to ±3.4 x 1038 6–9 цифр~6-9 digits 4 байта4 bytes System.Single
от ±5,0 × 10−324 до ±1,7 × 10308±5.0 × 10−324 to ±1.7 × 10308 15–17 цифр~15-17 digits 8 байт8 bytes System.Double
от ±1,0 x 10-28 до ±7,9228 x 1028±1.0 x 10-28 to ±7.9228 x 1028 28-29 знаков28-29 digits 16 байт16 bytes System.Decimal

В приведенной выше таблице каждый тип ключевого слова C# из крайнего левого столбца является псевдонимом для соответствующего типа .NET.In the preceding table, each C# type keyword from the leftmost column is an alias for the corresponding .NET type. Они взаимозаменяемые.They are interchangeable. Например, следующие объявления объявляют переменные одного типа:For example, the following declarations declare variables of the same type:

По умолчанию все типы с плавающей запятой имеют значение .The default value of each floating-point type is zero, . Все типы с плавающей запятой имеют константы и с минимальным и максимальными итоговыми значениями этого типа.Each of the floating-point types has the and constants that provide the minimum and maximum finite value of that type. Типы и также предоставляют константы, обозначающие бесконечные и нечисловые значения.The and types also provide constants that represent not-a-number and infinity values. Например, тип предоставляет следующие константы: Double.NaN, Double.NegativeInfinity и Double.PositiveInfinity.For example, the type provides the following constants: Double.NaN, Double.NegativeInfinity, and Double.PositiveInfinity.

Так как тип характеризуется более высокой точностью и меньшим диапазоном, чем и , он подходит для финансовых расчетов.Because the type has more precision and a smaller range than both and , it’s appropriate for financial and monetary calculations.

В одном и том же выражении можно сочетать и целочисленные типы, и типы и .You can mix integral types and the and types in an expression. В этом случае целочисленные типы неявно преобразуются в один из типов с плавающей запятой. При необходимости тип неявно преобразуется в .In this case, integral types are implicitly converted to one of the floating-point types and, if necessary, the type is implicitly converted to . Выражение вычисляется следующим образом.The expression is evaluated as follows:

  • Если в выражении есть тип , оно оценивается как или в реляционных сравнениях или сравнениях на равенство.If there is type in the expression, the expression evaluates to , or to in relational and equality comparisons.
  • Если в выражении нет типа , оно оценивается как или в реляционных сравнениях или сравнениях на равенство.If there is no type in the expression, the expression evaluates to , or to in relational and equality comparisons.

Можно также смешивать целочисленные типы и тип в выражении.You can also mix integral types and the type in an expression. В этом случае целочисленные типы неявно преобразуются в тип , а выражение вычисляется как или в реляционных сравнениях и сравнениях на равенство.In this case, integral types are implicitly converted to the type and the expression evaluates to , or to in relational and equality comparisons.

Тип нельзя смешивать с типами и в выражении.You cannot mix the type with the and types in an expression. В этом случае, если требуется выполнить арифметические операции или операции сравнения или равенства, необходимо явно преобразовать операнды из типа или в тип , как показано в следующем примере:In this case, if you want to perform arithmetic, comparison, or equality operations, you must explicitly convert the operands either from or to the type, as the following example shows:

Можно использовать строки стандартных числовых форматов или строки пользовательских числовых форматов для форматирования значения с плавающей запятой.You can use either standard numeric format strings or custom numeric format strings to format a floating-point value.

Переменные типа var в языке C#

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

В данном случае компилятор и так может однозначно понять, что тип переменной должен быть целым числом, так как справа от = стоит целое число. Чтобы сэкономить силы программиста можно использовать тип var, который будет автоматически определять тип переменной из контекста, при этом она все также будет оставаться сильнотипизированой. То есть, если ты сначала объявишь переменную как целое число, а потом попробуешь добавить к ней строку, то получишь синтаксическую ошибку.

Типы Single/Double/Currency

Данные
типа Single и Double содержат числа с плавающей
точкой из разных диапазонов значений.
Single – с 6 верными десятичными разрядами
после запятой, Double – с 14 верными
десятичными разрядами после запятой.
Данные типа Currency также служат для
представления чисел с плавающей точкой,
но число разрядов после запятой ограничено
четырьмя. Этого доста­точно при
выполнении денежных расчетов:

Dim
s
As
Single,
a
As
Single

s
=1.7 ‘Результат: 1.7

a
= — 62.697

В
VB в качестве разделителя целой и дробной
частей используется точка.

В
этих инструкциях присваивания справа
от знака равенства находятся константы
с дробной частью. Возможно применение
другого способа записи таких констант.
Этот способ состоит в записи константы
с порядком.

Константы
типа Singleс порядком
выглядят так:

Так
выглядит константа с порядком

А
вот чему равно ее значение

1.5Е-8

1.5*10-8или 0.000000015

1E-6

0.000001

1.256578E5

125657.8

При
записи констант типа Doubleвместо буквыEприменяется
букваD, что сигнализируетVB, что константа имеет
тип с плавающей точкой, но не обычной,
а двойной точности.

Так
выглядит константа с порядком

А
вот чему равно ее значение

1.5D-8

1.5*10-8или 0.000000015

1D-6

0.000001

1.256578E5

125657.8

К
числовым переменным можно применять
арифметические операции сложения (+),
вычитания (-), умножения (*), деления (/),
возведения в степень (^) и некоторые
другие, с которыми мы ознакомимся позже.

Тип String

Значением
переменной типа String может быть символ
или строка символов.

Для
того чтобы VB отличал константу типа
строки символов от имени переменной,
константа заключается в парные кавычки:

Dim
Переменная As
String

Переменная
= «Привет Мир» ‘Результат: Привет
Мир

Строки
можно объединять. В качестве оператора
объединения строк в VB можно использовать
как знак суммирования (+), так и знак
«коммерческое и» (&). Однако для
лучшей читаемости кода следует применять
только &, так как знак плюса используется
обычно при суммировании числовых
значений.

Dim
a As String, b As String, c As String

a
= “Петр”

b
= “великий”

c
= a+b
‘Значение: Петр великий

c
= a&b
‘Значение: Петр великий

Тип
Date

Значением
переменной типа Date может быть, дата,
время или дата и время.

Данные
типа Date специально предназначены для
обработки информации о дате и времени.
Чтобы для VB было понятно, что под указанным
значением подразумевается дата и/или
время, нужно поместить его между двумя
знаками #. При вводе следует пользоваться
американским форматом (мм/дд/гг). Если
же при вводе данных этого типа использовать
кавычки («), что допустимо, то следует
применять установленный в системе
формат даты и времени ( как правило –
дд/мм/гг):

Dim
d As Date

d
= #10/16/95# ‘Результат:
16.10.95

d
= #1:25:00 PM# ‘Результат: 13:25:00

d
=
«6.10.95» ‘Результат: 6.10.95

d
= «13:25» ‘Результат: 13:25:00

Тип
Boolean

Переменная
типаBoolean может принимать всего два
значения. Такая переменная может иметь
значениеTrue(истина) или значениеFalse(ложь).

В
VB значению True соответствует 1, а False — 0.
Если переменной этого типа присваивается
значение 0, то переменная содержит False.
Все другие значения подразумевают True:

DimnVarAsBoolean

nVar= 5 ‘Результат:True

Тип
Variant

Универсальный
тип данных Variant — это хамелеон. Он
устанавливает тип данных в зависимости
от содержимого. Если в такой переменной
содержится число, то переменная типа
Variant принимает соот­ветствующий тип
данных.

Если
ее содержимое — число 5, то она принимает
тип Integer;

если
1.2— Double; если текст, то String. Переменная
типа Variant изменяет свой тип во время
выполнения программы. Вот простой
пример:

Dim
V
As
Variant

V
= «25» ‘V содержит «25» (String)

V
= V +5 ‘V содержит 30 (Integer)

V
= V & » штук» ‘V содержит «30 штук»
(String)

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

Арифметические операции языка C#

Последнее обновление: 19.06.2017

В C# используется большинство операций, которые применяются и в других языках программирования. Операции представляют определенные действия над операндами —
участниками операции. В качестве операнда может выступать переменной или какое-либо значение (например, число).
Операции бывают унарными (выполняются над одним операндом), бинарными — над двумя операндами и тернарными — выполняются над тремя операндами. Рассмотрим все виды операций.

Бинарные арифметические операции:

  • +

    Операция сложения двух чисел:

    int x = 10;
    int z = x + 12; // 22
    
  • Операция вычитания двух чисел:

    int x = 10;
    int z = x - 6; // 4
    
  • *

    Операция умножения двух чисел:

    int x = 10;
    int z = x * 5; // 50
    
  • операция деления двух чисел:

    int x = 10;
    int z = x / 5; // 2
    
    double a = 10;
    double b = 3;
    double c = a / b; // 3.33333333
    

    При делении стоит учитывать, что если оба операнда представляют целые числа, то результат также будет округляться до целого числа:

    double z = 10 /  4; //результат равен 2

    Несмотря на то, что результат операции в итоге помещается в переменную типа double, которая позволяет сохранить дробную часть, но в самой опеации участвуют два литерала,
    которые по умолчанию рассматриваются как объекты int, то есть целые числа, и результат то же будет целочисленный.

    Для выхода из этой ситуации необходимо определять литералы или переменные, участвующие в операции, именно как типы double или float:

    double z = 10.0 /  4.0; //результат равен 2.5
  • %

    Операция получение остатка от целочисленного деления двух чисел:

    double x = 10.0;
    double z = x % 4.0; //результат равен 2
    

Также есть ряд унарных операций, в которых принимает участие один операнд:

++
Операция инкремента
Инкремент бывает префиксным: ++x — сначала значение переменной x увеличивается на 1,
а потом ее значение возвращается в качестве результата операции.

int x1 = 5;
int z1 = ++x1; // z1=6; x1=6
Console.WriteLine($"{x1} - {z1}");

int x2 = 5;
int z2 = x2++; // z2=5; x2=6
Console.WriteLine($"{x2} - {z2}");

Операция декремента или уменьшения значения на единицу. Также существует префиксная форма декремента () и
постфиксная ().

int x1 = 5;
int z1 = --x1; // z1=4; x1=4
Console.WriteLine($"{x1} - {z1}");

int x2 = 5;
int z2 = x2--; // z2=5; x2=4
Console.WriteLine($"{x2} - {z2}");

При выполнении сразу нескольких арифметических операций следует учитывать порядок их выполнения. Приоритет операций от наивысшего к низшему:

  1. Инкремент, декремент

  2. Умножение, деление, получение остатка

  3. Сложение, вычитание

Для изменения порядка следования операций применяются скобки.

Рассмотрим набор операций:

int a = 3;
int b = 5;
int c = 40;
int d = c---b*a;    // a=3  b=5  c=39  d=25
Console.WriteLine($"a={a}  b={b}  c={c}  d={d}");

Здесь мы имеем дело с тремя операциями: декремент, вычитание и умножение. Сначала выполняется декремент переменной c, затем умножение b*a, и в конце вычитание. То есть фактически набор операций выглядел так:

int d = (c--)-(b*a);

Но с помощью скобок мы могли бы изменить порядок операций, например, следующим образом:

int a = 3;
int b = 5;
int c = 40;
int d = (c-(--b))*a;    // a=3  b=4  c=40  d=108
Console.WriteLine($"a={a}  b={b}  c={c}  d={d}");

Ассоциативность операторов

Как выше было отмечено, операции умножения и деления имеют один и тот же приоритет, но какой тогда результат будет в выражении:

int x = 10 / 5 * 2;

Стоит нам трактовать это выражение как или как ? Ведь в зависимости от трактовки
мы получим разные результаты.

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

  • Левоассоциативные операторы, которые выполняются слева направо

  • Правоассоциативные операторы, которые выполняются справа налево

Все арифметические операторы (кроме префиксного инкремента и декремента) являются левоассоциативными, то есть выполняются слева направо. Поэтому выражение
необходимо трактовать как , то есть результатом будет 4.

НазадВперед

КортежиTuples

C# поддерживает _ кортежи*, которые предоставляют краткий синтаксис для группирования нескольких элементов данных в упрощенную структуру данных.C# supports _ tuples*, which provides concise syntax to group multiple data elements in a lightweight data structure. Чтобы создать экземпляр кортежа, необходимо объявить типы и имена элементов между и , как показано в следующем примере:You instantiate a tuple by declaring the types and names of the members between and , as shown in the following example:

Кортежи являются альтернативой для структуры данных с несколькими элементами. В них не используются стандартные блоки, описанные в следующей статье.Tuples provide an alternative for data structure with multiple members, without using the building blocks described in the next article.

Типы, допускающие значение NULLNullable types

Переменные любого типа могут быть объявлены как *не допускающие значение NULL* или *допускающие значение NULL*.Variables of any type may be declared as non-nullable or nullable. Переменная, допускающая значение NULL, может содержать дополнительное значение , указывающее на отсутствие значения.A nullable variable can hold an additional value, indicating no value. Типы значений, допускающие значение NULL (структуры или перечисления), представляются System.Nullable<T>.Nullable Value types (structs or enums) are represented by System.Nullable<T>. Ссылочные типы, не допускающие значение NULL и допускающие значение NULL, представляются базовым ссылочным типом.Non-nullable and Nullable Reference types are both represented by the underlying reference type. Различие представляется метаданными, которые считываются компилятором и некоторыми библиотеками.The distinction is represented by metadata read by the compiler and some libraries. Если ссылки, допускающие значение NULL, разыменовываются без предварительной проверки значения на , компилятор выдает предупреждения.The compiler provides warnings when nullable references are dereferenced without first checking their value against . Компилятор также выдает предупреждения, если ссылкам, не допускающим значение NULL, присваивается значение, которое может быть равно .The compiler also provides warnings when non-nullable references are assigned a value that may be . В следующем примере объявляется *переменная целочисленного типа, допускающая значение NULL*, и эта переменная инициализируется значением .The following example declares a nullable int, initializing it to . Затем ей присваивается значение .Then, it sets the value to . Затем те же действия выполняются для *строки, допускающей значение NULL*.It demonstrates the same concept with a nullable string. Дополнительные сведения см. в статьях Типы значений, допускающие значение NULL и Ссылочные типы, допускающие значение NULL.For more information, see nullable value types and nullable reference types.

интерфейсов,Interfaces

*Интерфейс* определяет контракт, который может быть реализован классами и структурами.An interface defines a contract that can be implemented by classes and structs. Интерфейс может содержать методы, свойства, события и индексаторы.An interface can contain methods, properties, events, and indexers. Интерфейс обычно не предоставляет реализацию элементов, которые в нем определены. Он лишь перечисляет элементы, которые должны быть определены в классах или структурах, реализующих этот интерфейс.An interface typically doesn’t provide implementations of the members it defines—it merely specifies the members that must be supplied by classes or structs that implement the interface.

Интерфейсы могут применять *множественное наследование*.Interfaces may employ multiple inheritance. В следующем примере интерфейс наследует одновременно от и .In the following example, the interface inherits from both and .

Классы и структуры могут реализовывать несколько интерфейсов.Classes and structs can implement multiple interfaces. В следующем примере класс реализует одновременно и .In the following example, the class implements both and .

Если класс или структура реализует конкретный интерфейс, любой экземпляр этого класса или структуры можно неявно преобразовать в такой тип интерфейса.When a class or struct implements a particular interface, instances of that class or struct can be implicitly converted to that interface type. Например.For example

Особенности языка C#

C# отличается очень богатым синтаксисом, который в то же время является простым и удобным. Особенно легко даётся изучение программистам, которые уже владеют знаниями и навыками работы с языками С, С++ и Java. C# сочетает в себе все преимущества этих языков, при этом не имеет их недостатков. Одним из основных достоинств «шарпа» является наличие мощных функций, и предоставление прямого доступа к операционной памяти. «Шарп» пользуется универсальными методами, интеграторами и типами данных, обеспечивающими наивысшую безопасность и производительность разработки программ. Характерной чертой языка является наличие выражений LINQ, с помощью которых можно создавать очень удобные кодовые конструкции со строго типизированными запросами. C# относится к объектно-ориентированным языкам, который имеет строгую типизацию. Каждая переменная и метод (в том числе входная точка Main), инкапсулируется при определении классов, при этом из родительского класса можно реализовывать неограниченное количество интерфейсов. Также C# предоставляет инновационные языковые конструкции, упрощающие разработку приложений:

  • сигнатура метода (называемая делегатом), позволяющая реализовывать безопасное оповещение о происходящем событии;
  • свойство, определяющее функции акцессора для закрытой переменной;
  • атрибут, предоставляющий данные о типе функции/переменной/объекта при написании кода;
  • внутристрочное комментирование (для XML-документов);
  • LINQ – языковой запрос в отношении различных источников данных.

Чтобы взаимодействовать с другими программными обеспечениями типа Windows (объекты COM, собственные библиотеки DLL), язык C# имеет процесс «Взаимодействия». Они позволяют приложениям, написанным на «шарпе», выполнять практически все действия и функции, которые прописаны машинным кодом C++

Также языком C# поддерживается набор указателей и «небезопасных» блоков кода в тех случаях, когда критически важно наличие прямого доступа к операционной памяти

Символы

В C# символы представлены не 8-разрядным кодом, как во многих других языках
программирования, например , а 16-разрядным кодом, который называется юникодом (Unicode). В юникоде набор символов представлен настолько широко, что он охватывает символы практически из всех естественных языков на свете. Если для многих
естественных языков, в том числе английского, французского и немецкого, характерны
относительно небольшие алфавиты, то в ряде других языков, например китайском,
употребляются довольно обширные наборы символов, которые нельзя представить
8-разрядным кодом. Для преодоления этого ограничения в C# определен тип char,
представляющий 16-разрядные значения без знака в пределах от 0 до 65 535. При этом
стандартный набор символов в 8-разрядном коде ASCII является подмножеством юникода в пределах от 0 до 127. Следовательно, символы в коде ASCII по-прежнему остаются действительными в C#.

Для того чтобы присвоить значение символьной переменной, достаточно заключить это значение (т.е. символ) в одинарные кавычки:

Несмотря на то что тип char определен в C# как целочисленный, его не следует
путать со всеми остальными целочисленными типами. Дело в том, что в C# отсутствует автоматическое преобразование символьных значений в целочисленные и обратно.
Например, следующий фрагмент кода содержит ошибку:

Наравне с представлением char как символьных литералов, их можно представлять
как 4-разрядные шестнадцатеричные значения Unicode (например, ‘\u0041’), целочисленные значения с приведением (например, (char) 65) или же шестнадцатеричные значения (например, ‘\x0041’). Кроме того, они могут быть представлены в виде .

Структуры

Последнее обновление: 16.09.2019

Наряду с классами структуры представляют еще один способ создания собственных типов данных в C#. Более того многие примитивные типы, например,
int, double и т.д., по сути являются структурами.

Например, определим структуру, которая представляет человека:

struct User
{
	public string name;
	public int age;

	public void DisplayInfo()
	{
		Console.WriteLine($"Name: {name}  Age: {age}");
	}
}

Как и классы, структуры могут хранить состояние в виде переменных и определять поведение в виде методов. Так, в данном случае
определены две переменные — name и age для хранения соответственно имени и возраста человека и метод DisplayInfo для вывода информации о человеке.

Используем эту структуру в программе:

using System;

namespace HelloApp
{ 
    struct User
    {
        public string name;
        public int age;

        public void DisplayInfo()
        {
            Console.WriteLine($"Name: {name}  Age: {age}");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            User tom;
            tom.name = "Tom";
            tom.age = 34;
            tom.DisplayInfo();
			
            Console.ReadKey();
        }
    }
}

В данном случае создается объект tom. У него устанавливаются значения глобальных переменных, и затем выводится
информация о нем.

Конструкторы структуры

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

User tom;

Однако если мы таким образом создаем объект структуры, то обязательно надо проинициализировать все поля (глобальные переменные) структуры перед получением
их значений или перед вызовом методов структуры. То есть, например, в следующем случае мы получим ошибку, так как обращение к полям и методам происходит
до присвоения им начальных значений:

User tom;
int x = tom.age;	// Ошибка
tom.DisplayInfo();	// Ошибка

Также мы можем использовать для создания структуры конструктор без параметров, который есть в структуре по умолчанию и при вызове которого полям структуры будет
присвоено значение по умолчанию (например, для числовых типов это число 0):

User tom = new User();
tom.DisplayInfo();	// Name:   Age: 0

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

Например, изменим структуру User:

Также мы можем определить свои конструкторы. Например, изменим структуру User:

using System;

namespace HelloApp
{
    struct User
    {
        public string name;
        public int age;
        public User(string name, int age)
        {
            this.name = name;
            this.age = age;
        }
        public void DisplayInfo()
        {
            Console.WriteLine($"Name: {name}  Age: {age}");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            User tom = new User("Tom", 34);
            tom.DisplayInfo();

            User bob = new User();
            bob.DisplayInfo();
			
            Console.ReadKey();
        }
    }
}

Важно учитывать, что если мы определяем конструктор в структуре, то он должен инициализировать все поля структуры, как в данном случае устанавливаются
значения для переменных name и age. Также, как и для класса, можно использовать инициализатор для создания структуры:

Также, как и для класса, можно использовать инициализатор для создания структуры:

User person = new User { name = "Sam", age = 31 };

Но в отличие от класса нельзя инициализировать поля структуры напрямую при их объявлении, например, следующим образом:

struct User
{
	public string name = "Sam";		// ! Ошибка
	public int age = 23;			// ! Ошибка
	public void DisplayInfo()
	{
		Console.WriteLine($"Name: {name}  Age: {age}");
	}
}

НазадВперед

Символьные типыCharacter types

Тип является типом символьного представления, который эффективно кодирует члены базовой кодировки выполнения.The type is a character representation type that efficiently encodes members of the basic execution character set. Компилятор C++ обрабатывает переменные типа , и, в отличие от разных типов.The C++ compiler treats variables of type , , and as having different types.

Зависящие от Майкрософт: переменные типа помещаются в тип по умолчанию, если не используется параметр компиляции.Microsoft-specific: Variables of type are promoted to as if from type by default, unless the compilation option is used. В этом случае они рассматриваются как тип и переносятся в без расширения знака.In this case, they’re treated as type and are promoted to without sign extension.

Переменная типа является расширенным символом или типом многобайтового символа.A variable of type is a wide-character or multibyte character type. Используйте префикс перед символьным или строковым литералом, чтобы указать тип расширенных символов.Use the prefix before a character or string literal to specify the wide-character type.

Для конкретного Майкрософт: по умолчанию является собственным типом, но можно использовать для создания определения типа для .Microsoft-specific: By default, is a native type, but you can use to make a typedef for . Тип является синонимом для собственного типа, характерным для Microsoft .The type is a Microsoft-specific synonym for the native type.

Тип используется для символьного представления UTF-8.The type is used for UTF-8 character representation. Он имеет то же представление , что и, но обрабатывается компилятором как отдельный тип.It has the same representation as , but is treated as a distinct type by the compiler. Тип является новым в c++ 20.The type is new in C++20. Для Майкрософт: для использования требуется параметр компилятора.Microsoft-specific: use of requires the compiler option.

Тип используется для символьного представления UTF-16.The type is used for UTF-16 character representation. Он должен быть достаточно большим, чтобы представлять любой блок кода UTF-16.It must be large enough to represent any UTF-16 code unit. Компилятор обрабатывает его как отдельный тип.It’s treated as a distinct type by the compiler.

Тип используется для символьного представления UTF-32.The type is used for UTF-32 character representation. Он должен быть достаточно большим, чтобы представлять любую единицу кода UTF-32.It must be large enough to represent any UTF-32 code unit. Компилятор обрабатывает его как отдельный тип.It’s treated as a distinct type by the compiler.

Float ranges and precision

In order to find the value ranges of the floating-point number in your platform, you can use the header file. This header file defines macros such as  and that store the float value ranges and precision of the  type.

You can also find the corresponding macros for and with the prefixes  and

The following program illustrates the storage size and precision of floating-point numbers in your system.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

/*
* File   : main.c
* Author : zentut.com
* Purpose: C float demo
*/
 
#include <stdio.h>
#include <float.h>
 

intmain()

{

printf(«Storage size: %d bytes\n»

«Minimum float value: %E\n»

«Maximum float value: %E\n»

«Precision: %d decimal digits\n»,

sizeof(float),

FLT_MIN,

FLT_MAX,

FLT_DIG);

puts(«\nExample of float precision:\n»);

doubled=12345.6;

floatf=(float)d;

printf(«The floating-point number d  «

«%18.10f\n»,d);

printf(«Stored in a variable f\n»

«of type float as the value   «

«%18.10f\n»,f);

return;

}

The output of the program in our system is as follows:

1
2
3
4
5
6
7
8
9
10

Storage size4bytes

Minimum floatvalue1.175494E-038

Maximum floatvalue3.402823E+038

Precision6decimal digits

Example of floatprecision

The floating-point numberd12345.6000000000

Stored inavariablef

of type floatasthe value12345.5996093750

In this tutorial, we have introduced you various C float types and explained what precision means to each type of float in C.

  • Was this tutorial helpful ?
Добавить комментарий

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

Adblock
detector