Тип big.Float
Тип big.Float из пакета math/big представляет число с плавающей точкой произвольной точности. В отличие от встроенных типов float32 и float64, big.Float позволяет работать с числами, имеющими произвольное количество знаков после запятой, и не ограничен стандартными пределами точности. Это делает его незаменимым для финансовых расчетов, криптографии, научных вычислений и других областей, где критична высокая точность. При создании нового экземпляра через new(big.Float) или big.NewFloat, вы можете указать желаемую точность в битах через метод SetPrec. Основные арифметические операции — сложение, вычитание, умножение и деление — выполняются методами Add, Sub, Mul и Quo соответственно.
Создание и базовая настройка
Создать big.Float можно несколькими способами. Рассмотрим основные из них:
package 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)
}
Результат выполнения кода:
0
3.14159
0
Арифметические операции
Все арифметические операции с big.Float выполняются методами, которые изменяют сам объект и возвращают его же для цепочки вызовов. Рассмотрим основные операции:
package 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)
}
Результат выполнения кода:
13.7
7.3
33.6
3.28125
Сравнение чисел
Для сравнения двух big.Float используется метод Cmp, который возвращает -1 если первое число меньше второго, 0 если они равны, и 1 если первое число больше второго. Учтите, что сравнение происходит с учетом текущей точности:
package 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)
}
Результат выполнения кода:
0
-1
Преобразование в строку
Для преобразования big.Float в строку используется метод String или Text с указанием формата. Метод Text позволяет вывести число в различных системах счисления:
package 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))
}
Результат выполнения кода:
123.456
123.46
1.235e+02
Операции с высокой точностью
Одним из главных преимуществ big.Float является возможность работы с числами, имеющими большое количество знаков после запятой. Установим высокую точность и выполним сложные вычисления:
package 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())
}
Результат выполнения кода:
9.869604401089358618834490999876151135313699407240790626413349
Смотрите также
-
тип
big.Int,
предназначенный для работы с целыми числами произвольной точности -
тип
big.Rat,
предназначенный для работы с рациональными числами -
функцию
big.NewFloat,
создающую новыйbig.Floatиз значенияfloat64 -
метод
big.Float.SetPrec,
устанавливающий точность числа в битах