Тип big.Float

Тип big.Float из пакета math/big представляет число с плавающей точкой произвольной точности. В отличие от встроенных типов float32 и float64, big.Float позволяет работать с числами, имеющими произвольное количество знаков после запятой, и не ограничен стандартными пределами точности. Это делает его незаменимым для финансовых расчетов, криптографии, научных вычислений и других областей, где критична высокая точность. При создании нового экземпляра через new(big.Float) или big.NewFloat, вы можете указать желаемую точность в битах через метод SetPrec. Основные арифметические операции — сложение, вычитание, умножение и деление — выполняются методами Add, Sub, Mul и Quo соответственно.

Создание и базовая настройка

Создать big.Float можно несколькими способами. Рассмотрим основные из них:

gopackage main

import (
  "fmt"
  "math/big"
)

func main() {
  // Способ 1: через new
  f1 := new(big.Float)
  fmt.Println(f1)

  // Способ 2: через big.NewFloat с установкой значения
  f2 := big.NewFloat(3.14159)
  fmt.Println(f2)

  // Способ 3: установка точности (в битах)
  f3 := new(big.Float).SetPrec(100)
  fmt.Println(f3)
}

Результат выполнения кода:

go0
3.14159
0

Арифметические операции

Все арифметические операции с big.Float выполняются методами, которые изменяют сам объект и возвращают его же для цепочки вызовов. Рассмотрим основные операции:

gopackage main

import (
  "fmt"
  "math/big"
)

func main() {
  a := big.NewFloat(10.5)
  b := big.NewFloat(3.2)

  // Сложение
  res := new(big.Float).Add(a, b)
  fmt.Println(res)

  // Вычитание
  res.Sub(a, b)
  fmt.Println(res)

  // Умножение
  res.Mul(a, b)
  fmt.Println(res)

  // Деление
  res.Quo(a, b)
  fmt.Println(res)
}

Результат выполнения кода:

go13.7
7.3
33.6
3.28125

Сравнение чисел

Для сравнения двух big.Float используется метод Cmp, который возвращает -1 если первое число меньше второго, 0 если они равны, и 1 если первое число больше второго. Учтите, что сравнение происходит с учетом текущей точности:

gopackage main

import (
  "fmt"
  "math/big"
)

func main() {
  a := big.NewFloat(5.5)
  b := big.NewFloat(5.5000)

  // Сравнение чисел
  cmp := a.Cmp(b)
  fmt.Println(cmp)

  c := big.NewFloat(10.0)
  cmp = a.Cmp(c)
  fmt.Println(cmp)
}

Результат выполнения кода:

go0
-1

Преобразование в строку

Для преобразования big.Float в строку используется метод String или Text с указанием формата. Метод Text позволяет вывести число в различных системах счисления:

gopackage main

import (
  "fmt"
  "math/big"
)

func main() {
  f := big.NewFloat(123.456)

  // Стандартное преобразование
  fmt.Println(f.String())

  // Text с указанием формата и точности
  fmt.Println(f.Text('f', 2))
  fmt.Println(f.Text('e', 3))
}

Результат выполнения кода:

go123.456
123.46
1.235e+02

Операции с высокой точностью

Одним из главных преимуществ big.Float является возможность работы с числами, имеющими большое количество знаков после запятой. Установим высокую точность и выполним сложные вычисления:

gopackage main

import (
  "fmt"
  "math/big"
)

func main() {
  // Устанавливаем точность в 200 бит
  prec := uint(200)
  pi := new(big.Float).SetPrec(prec).SetFloat64(3.141592653589793)

  // Выполняем возведение в квадрат с высокой точностью
  res := new(big.Float).SetPrec(prec).Mul(pi, pi)
  fmt.Println(res.String())
}

Результат выполнения кода:

go9.869604401089358618834490999876151135313699407240790626413349

Смотрите также

  • тип big.Int,
    предназначенный для работы с целыми числами произвольной точности
  • тип big.Rat,
    предназначенный для работы с рациональными числами
  • функцию big.NewFloat,
    создающую новый big.Float из значения float64
  • метод big.Float.SetPrec,
    устанавливающий точность числа в битах