На этом шаге рассмотрим вещественные числа в Go.
Язык Go предоставляет два варианта чисел с плавающей точкой разного размера, float32 и float64. Их арифметические свойства регулируются стандартом IEEE 754 и реализованы на всех современные процессорах. Рассмотрим диапазоны значений этих типов (табл. 1).
| Тип | Диапазон представляемых значений | 
|---|---|
| float32 | ±3,40282346638528859811704183484516925440 × 1038 Мантисса может быть представлена с точностью до 7 десятичных разрядов | 
| float64 | ±1,797693134862315708145274237317043567981   × 10308 Мантисса может быть представлена с точностью до 15 десятичных разрядов | 
В языке Go поддерживаются все операции с вещественными числами, перечисленные в таблице 1 шага 13. Большинство констант из пакета math, и все его функции перечислены в таблицах 1 и 2.
| Константа | Описание | 
|---|---|
| math.E | Константа e; примерно 2,718281828459045 | 
| math.Ln2 | loge2, примерно 0,693147180559945 | 
| math.Ln10 | log102, примерно 2,302585092994045 | 
| math.Log2E | 1/loge2, примерно 1,442695021629333 | 
| math.Log10E | 1/loge10, примерно 0,434294492006301 | 
| math.Pi | Константа π, примерно 3,141592653589793 | 
| math.Phi | Константа φ, примерно 1,618033988749984 | 
| math.Sqrt2 | √2, примерно 1,414213562373095 | 
| math.SqrtE | √e, примерно 1,648721270700128 | 
| math.SqrtPi | √π, примерно 1,772453850905516 | 
| math.SqrtPhi | √φ, примерно 1,272019649514068 | 
Все функции из пакета math принимают и возвращают значения типа float64, если явно не указано иное.
| Функция | Описание | 
|---|---|
| math.Abs(x) | |x|, абсолютное значение x | 
| math.Cbrt(x) |  , кубический корень из x | 
| math.Ceil(x) |  , наименьшее целое, большее или равное x;
math.Ceil(5.4) = = 6.0 | 
| math.Cos(x) | Косинус угла x, выраженного в радианах | 
| math.Exp(x) | ex | 
| math.Exp2(x) | 2x | 
| math.Floor(x) |  , наибольшее целое, меньшее или равное x;
math.Floor(5.4) = = 5.0 | 
| math.Log(x) | logex | 
| math.Log10(x) | log10x | 
| math.Log2(x) | log2x | 
| math.Max(x, y) | Наибольшее из чисел x и y | 
| math.Min(x, y) | Наименьшее из чисел x и y | 
| math.Mod(x, y) | Остаток от деления x на y | 
| math.Pow(x, y) | xy | 
| math.Pow10(n) | 10n в виде значения типа float64, где значение n имеет тип int | 
| math.Signbit(x) | Возвращает значение типа bool; true, если x является отрицательным числом (включая -0.0) | 
| math.Sin(x) | Синус угла x, выраженного в радианах | 
| math.SinCos(x) | Синус и косинус угла x, выраженного в радианах | 
| math.Sqrt(x) | √x | 
| math.Tan(x) | Тангенс угла x, выраженного в радианах | 
| math.Trunc(x) | x с усеченной дробной частью | 
Вещественные числа записываются в форме с десятичной точкой или в экспоненциальной форме, например 0.0, 3., 8.2, –7.4, –6e4, .1, 5.9E–3.
С вещественными числами могут использоваться все операторы сравнения, перечисленные в таблице 1 шага 12.
Задание 1. Рассмотрим пример работы с вещественными числами:
Раскрыть/скрыть решение и комментарии.
В большинстве случаев, где необходимы вещественные числа, лучше использовать значения типа float64, особенно если учесть, что все функции в пакете math оперируют значениями типа float64.
В языке Go имеется также тип float32. Поскольку в Go вещественные числа имеют строго определенный размер, их всегда можно без опаски читать из внешних источников, таких как файлы и сетевые соединения, или записывать в них.
Вещественные числа можно преобразовывать в целые значения, используя стандартный синтаксис (например, int(вещественное_число)), в этом случае дробная часть просто отбрасывается. Разумеется, если вещественное число превосходит по величине максимально возможное значение целочисленного типа, в который выполняется преобразование, в результате будет получено непредсказуемое значение. Решить эту проблему можно с помощью собственной функции преобразования.
Задание 2. Реализовать функцию преобразования вещественного числа в целое.
Раскрыть/скрыть решение и комментарии.
На следующем шаге рассмотрим введение в инструкции в Go.