Spec-Zone.ru › Go

Пакет big

  • import "math/big"
  • Обзор
  • Индекс
  • Примеры

Обзор

Пакет big реализует арифметику произвольной точности (большие числа). Поддерживаются следующие числовые типы:

Int    signed integers
Rat    rational numbers
Float  floating-point numbers

Нулевое значение для Int, Rat или Float соответствует 0. Таким образом, новые значения можно объявлять обычным способом и обозначать 0 без дальнейшей инициализации:

var x Int        // &x is an *Int of value 0
var r = &Rat{}   // r is a *Rat of value 0
y := new(Float)  // y is a *Float of value 0

В качестве альтернативы новые значения можно выделять и инициализировать с помощью функций-фабрик следующего вида:

func NewT(v V) *T

Например, NewInt(x) возвращает *Int, установленный в значение int64 аргумента x, NewRat(a, b) возвращает *Rat, установленный в дробь a/b, где a и b — значения int64, а NewFloat(f) возвращает *Float, инициализированный аргументом float64 f. Больше гибкости предоставляют явные установщики, например:

var z1 Int
z1.SetUint64(123)                 // z1 := 123
z2 := new(Rat).SetFloat64(1.25)   // z2 := 5/4
z3 := new(Float).SetInt(z1)       // z3 := 123.0

Установщики, числовые операции и предикаты представлены методами вида:

func (z *T) SetV(v V) *T          // z = v
func (z *T) Unary(x *T) *T        // z = unary x
func (z *T) Binary(x, y *T) *T    // z = x binary y
func (x *T) Pred() P              // p = pred(x)

где T — один из Int, Rat или Float. Для унарных и бинарных операций результатом является получатель (обычно он называется z в этом случае; см. ниже); если это один из операндов x или y, он может быть безопасно перезаписан (и его память повторно использована).

Арифметические выражения обычно записываются как последовательность отдельных вызовов методов, при этом каждый вызов соответствует операции. Получатель обозначает результат, а аргументы метода — операнды операции. Например, имея три значения *Int a, b и c, вызов

c.Add(a, b)

вычисляет сумму a + b и сохраняет результат в c, перезаписывая любое значение, которое хранилось в c ранее. Если не указано иное, операции допускают алиасинг параметров, поэтому совершенно нормально написать

sum.Add(sum, x)

для накопления значений x в сумме.

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

Условность записи: Входящие параметры метода (включая получателя) имеют согласованное именование в API для разъяснения их использования. Входящие операнды обычно называются x, y, a, b и т. д., но никогда z. Параметр, определяющий результат, называется z (обычно получатель).

Например, аргументы для (*Int).Add называются x и y, а поскольку получатель указывает место назначения результата, он называется z:

func (z *Int) Add(x, y *Int) *Int

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

Методы, которые не требуют передачи значения результата (например, Int.Sign), просто возвращают результат. В этом случае получатель обычно является первым операндом, который называется x:

func (x *Int) Sign() int

Различные методы поддерживают преобразования между строками и соответствующими числовыми значениями, и наоборот: значения *Int, *Rat и *Float реализуют интерфейс Stringer для (стандартного) строкового представления значения, но также предоставляют методы SetString для инициализации значения из строки в различных поддерживаемых форматах (см. документацию по SetString).

Наконец, *Int, *Rat и *Float удовлетворяют fmt.Scanner для сканирования и (за исключением *Rat) интерфейса Formatter для форматированного вывода.

Пример (EConvergents)

Этот пример демонстрирует, как использовать big.Rat для вычисления первых 15 членов последовательности рациональных конвергентов для константы e (основание натурального логарифма).

Код:

package big_test

import (
    "fmt"
    "math/big"
)

// Use the classic continued fraction for e
//
//	e = [1; 0, 1, 1, 2, 1, 1, ... 2n, 1, 1, ...]
//
// i.e., for the nth term, use
//
//	   1          if   n mod 3 != 1
//	(n-1)/3 * 2   if   n mod 3 == 1
func recur(n, lim int64) *big.Rat {
    term := new(big.Rat)
    if n%3 != 1 {
        term.SetInt64(1)
    } else {
        term.SetInt64((n - 1) / 3 * 2)
    }

    if n > lim {
        return term
    }

    // Directly initialize frac as the fractional
    // inverse of the result of recur.
    frac := new(big.Rat).Inv(recur(n+1, lim))

    return term.Add(term, frac)
}

// This example demonstrates how to use big.Rat to compute the
// first 15 terms in the sequence of rational convergents for
// the constant e (base of natural logarithm).
func Example_eConvergents() {
    for i := 1; i <= 15; i++ {
        r := recur(0, int64(i))

        // Print r both as a fraction and as a floating-point number.
        // Since big.Rat implements fmt.Formatter, we can use %-13s to
        // get a left-aligned string representation of the fraction.
        fmt.Printf("%-13s = %s\n", r, r.FloatString(8))
    }

    // Output:
    // 2/1           = 2.00000000
    // 3/1           = 3.00000000
    // 8/3           = 2.66666667
    // 11/4          = 2.75000000
    // 19/7          = 2.71428571
    // 87/32         = 2.71875000
    // 106/39        = 2.71794872
    // 193/71        = 2.71830986
    // 1264/465      = 2.71827957
    // 1457/536      = 2.71828358
    // 2721/1001     = 2.71828172
    // 23225/8544    = 2.71828184
    // 25946/9545    = 2.71828182
    // 49171/18089   = 2.71828183
    // 517656/190435 = 2.71828183
}

Пример (Фибоначчи)

Этот пример демонстрирует, как использовать big.Int для вычисления наименьшего числа Фибоначчи с 100 десятичными знаками и проверки, является ли оно простым.

Код:

// Initialize two big ints with the first two numbers in the sequence.
a := big.NewInt(0)
b := big.NewInt(1)

// Initialize limit as 10^99, the smallest integer with 100 digits.
var limit big.Int
limit.Exp(big.NewInt(10), big.NewInt(99), nil)

// Loop while a is smaller than 1e100.
for a.Cmp(&limit) < 0 {
    // Compute the next Fibonacci number, storing it in a.
    a.Add(a, b)
    // Swap a and b so that b is the next number in the sequence.
    a, b = b, a
}
fmt.Println(a) // 100-digit Fibonacci number

// Test a for primality.
// (ProbablyPrimes' argument sets the number of Miller-Rabin
// rounds to be performed. 20 is a good value.)
fmt.Println(a.ProbablyPrime(20))

Вывод:

1344719667586153181419716641724567886890850696275767987106294472017884974410332069524504824747437757
false

Пример (Sqrt2)

Этот пример показывает, как использовать big.Float для вычисления квадратного корня из 2 с точностью 200 бит и как вывести результат в виде десятичного числа.

Код:

// We'll do computations with 200 bits of precision in the mantissa.
const prec = 200

// Compute the square root of 2 using Newton's Method. We start with
// an initial estimate for sqrt(2), and then iterate:
//     x_{n+1} = 1/2 * ( x_n + (2.0 / x_n) )

// Since Newton's Method doubles the number of correct digits at each
// iteration, we need at least log_2(prec) steps.
steps := int(math.Log2(prec))

// Initialize values we need for the computation.
two := new(big.Float).SetPrec(prec).SetInt64(2)
half := new(big.Float).SetPrec(prec).SetFloat64(0.5)

// Use 1 as the initial estimate.
x := new(big.Float).SetPrec(prec).SetInt64(1)

// We use t as a temporary variable. There's no need to set its precision
// since big.Float values with unset (== 0) precision automatically assume
// the largest precision of the arguments when used as the result (receiver)
// of a big.Float operation.
t := new(big.Float)

// Iterate.
for i := 0; i <= steps; i++ {
    t.Quo(two, x)  // t = 2.0 / x_n
    t.Add(x, t)    // t = x_n + (2.0 / x_n)
    x.Mul(half, t) // x_{n+1} = 0.5 * t
}

// We can use the usual fmt.Printf verbs since big.Float implements fmt.Formatter
fmt.Printf("sqrt(2) = %.50f\n", x)

// Print the error between 2 and x*x.
t.Mul(x, x) // t = x*x
fmt.Printf("error = %e\n", t.Sub(two, t))

Вывод:

sqrt(2) = 1.41421356237309504880168872420969807856967187537695
error = 0.000000e+00

Индекс

  • Константы
  • функция Jacobi(x, y *Int) int
  • тип Accuracy
  • функция (i Accuracy) String() string
  • тип ErrNaN
  • функция (err ErrNaN) Error() string
  • тип Float
  • функция NewFloat(x float64) *Float
  • функция ParseFloat(s string, base int, prec uint, mode RoundingMode) (f *Float, b int, err error)
  • функция (z *Float) Abs(x *Float) *Float
  • функция (x *Float) Acc() Accuracy
  • функция (z *Float) Add(x, y *Float) *Float
  • функция (x *Float) Append(buf []byte, fmt byte, prec int) []byte
  • функция (x *Float) AppendText(b []byte) ([]byte, error)
  • функция (x *Float) Cmp(y *Float) int
  • функция (z *Float) Copy(x *Float) *Float
  • функция (x *Float) Float32() (float32, Accuracy)
  • функция (x *Float) Float64() (float64, Accuracy)
  • функция (x *Float) Format(s fmt.State, format rune)
  • функция (z *Float) GobDecode(buf []byte) error
  • функция (x *Float) GobEncode() ([]byte, error)
  • функция (x *Float) Int(z *Int) (*Int, Accuracy)
  • функция (x *Float) Int64() (int64, Accuracy)
  • функция (x *Float) IsInf() bool
  • функция (x *Float) IsInt() bool
  • функция (x *Float) MantExp(mant *Float) (exp int)
  • функция (x *Float) MarshalText() (text []byte, err error)
  • функция (x *Float) MinPrec() uint
  • функция (x *Float) Mode() RoundingMode
  • функция (z *Float) Mul(x, y *Float) *Float
  • функция (z *Float) Neg(x *Float) *Float
  • функция (z *Float) Parse(s string, base int) (f *Float, b int, err error)
  • функция (x *Float) Prec() uint
  • функция (z *Float) Quo(x, y *Float) *Float
  • функция (x *Float) Rat(z *Rat) (*Rat, Accuracy)
  • функция (z *Float) Scan(s fmt.ScanState, ch rune) error
  • функция (z *Float) Set(x *Float) *Float
  • функция (z *Float) SetFloat64(x float64) *Float
  • функция (z *Float) SetInf(signbit bool) *Float
  • функция (z *Float) SetInt(x *Int) *Float
  • функция (z *Float) SetInt64(x int64) *Float
  • функция (z *Float) SetMantExp(mant *Float, exp int) *Float
  • функция (z *Float) SetMode(mode RoundingMode) *Float
  • функция (z *Float) SetPrec(prec uint) *Float
  • функция (z *Float) SetRat(x *Rat) *Float
  • функция (z *Float) SetString(s string) (*Float, bool)
  • функция (z *Float) SetUint64(x uint64) *Float
  • функция (x *Float) Sign() int
  • функция (x *Float) Signbit() bool
  • функция (z *Float) Sqrt(x *Float) *Float
  • функция (x *Float) String() string
  • функция (z *Float) Sub(x, y *Float) *Float
  • функция (x *Float) Text(format byte, prec int) string
  • функция (x *Float) Uint64() (uint64, Accuracy)
  • функция (z *Float) UnmarshalText(text []byte) error
  • тип Int
  • функция NewInt(x int64) *Int
  • функция (z *Int) Abs(x *Int) *Int
  • функция (z *Int) Add(x, y *Int) *Int
  • функция (z *Int) And(x, y *Int) *Int
  • функция (z *Int) AndNot(x, y *Int) *Int
  • функция (x *Int) Append(buf []byte, base int) []byte
  • функция (x *Int) AppendText(b []byte) (text []byte, err error)
  • функция (z *Int) Binomial(n, k int64) *Int
  • функция (x *Int) Bit(i int) uint
  • функция (x *Int) BitLen() int
  • функция (x *Int) Bits() []Word
  • функция (x *Int) Bytes() []byte
  • функция (x *Int) Cmp(y *Int) (r int)
  • функция (x *Int) CmpAbs(y *Int) int
  • функция (z *Int) Div(x, y *Int) *Int
  • функция (z *Int) DivMod(x, y, m *Int) (*Int, *Int)
  • функция (z *Int) Exp(x, y, m *Int) *Int
  • функция (x *Int) FillBytes(buf []byte) []byte
  • функция (x *Int) Float64() (float64, Accuracy)
  • функция (x *Int) Format(s fmt.State, ch rune)
  • функция (z *Int) GCD(x, y, a, b *Int) *Int
  • функция (z *Int) GobDecode(buf []byte) error
  • функция (x *Int) GobEncode() ([]byte, error)
  • функция (x *Int) Int64() int64
  • функция (x *Int) IsInt64() bool
  • функция (x *Int) IsUint64() bool
  • функция (z *Int) Lsh(x *Int, n uint) *Int
  • функция (x *Int) MarshalJSON() ([]byte, error)
  • функция (x *Int) MarshalText() (text []byte, err error)
  • функция (z *Int) Mod(x, y *Int) *Int
  • функция (z *Int) ModInverse(g, n *Int) *Int
  • функция (z *Int) ModSqrt(x, p *Int) *Int
  • функция (z *Int) Mul(x, y *Int) *Int
  • функция (z *Int) MulRange(a, b int64) *Int
  • функция (z *Int) Neg(x *Int) *Int
  • функция (z *Int) Not(x *Int) *Int
  • функция (z *Int) Or(x, y *Int) *Int
  • функция (x *Int) ProbablyPrime(n int) bool
  • функция (z *Int) Quo(x, y *Int) *Int
  • функция (z *Int) QuoRem(x, y, r *Int) (*Int, *Int)
  • функция (z *Int) Rand(rnd *rand.Rand, n *Int) *Int
  • функция (z *Int) Rem(x, y *Int) *Int
  • функция (z *Int) Rsh(x *Int, n uint) *Int
  • функция (z *Int) Scan(s fmt.ScanState, ch rune) error
  • функция (z *Int) Set(x *Int) *Int
  • функция (z *Int) SetBit(x *Int, i int, b uint) *Int
  • функция (z *Int) SetBits(abs []Word) *Int
  • функция (z *Int) SetBytes(buf []byte) *Int
  • функция (z *Int) SetInt64(x int64) *Int
  • функция (z *Int) SetString(s string, base int) (*Int, bool)
  • функция (z *Int) SetUint64(x uint64) *Int
  • функция (x *Int) Sign() int
  • функция (z *Int) Sqrt(x *Int) *Int
  • функция (x *Int) String() string
  • функция (z *Int) Sub(x, y *Int) *Int
  • функция (x *Int) Text(base int) string
  • функция (x *Int) TrailingZeroBits() uint
  • функция (x *Int) Uint64() uint64
  • функция (z *Int) UnmarshalJSON(text []byte) error
  • функция (z *Int) UnmarshalText(text []byte) error
  • функция (z *Int) Xor(x, y *Int) *Int
  • тип Rat
  • функция NewRat(a, b int64) *Rat
  • функция (z *Rat) Abs(x *Rat) *Rat
  • функция (z *Rat) Add(x, y *Rat) *Rat
  • функция (x *Rat) AppendText(b []byte) ([]byte, error)
  • функция (x *Rat) Cmp(y *Rat) int
  • функция (x *Rat) Denom() *Int
  • функция (x *Rat) Float32() (f float32, exact bool)
  • функция (x *Rat) Float64() (f float64, exact bool)
  • функция (x *Rat) FloatPrec() (n int, exact bool)
  • функция (x *Rat) FloatString(prec int) string
  • функция (z *Rat) GobDecode(buf []byte) error
  • функция (x *Rat) GobEncode() ([]byte, error)
  • функция (z *Rat) Inv(x *Rat) *Rat
  • функция (x *Rat) IsInt() bool
  • функция (x *Rat) MarshalText() (text []byte, err error)
  • функция (z *Rat) Mul(x, y *Rat) *Rat
  • функция (z *Rat) Neg(x *Rat) *Rat
  • функция (x *Rat) Num() *Int
  • функция (z *Rat) Quo(x, y *Rat) *Rat
  • функция (x *Rat) RatString() string
  • функция (z *Rat) Scan(s fmt.ScanState, ch rune) error
  • функция (z *Rat) Set(x *Rat) *Rat
  • функция (z *Rat) SetFloat64(f float64) *Rat
  • функция (z *Rat) SetFrac(a, b *Int) *Rat
  • функция (z *Rat) SetFrac64(a, b int64) *Rat
  • функция (z *Rat) SetInt(x *Int) *Rat
  • функция (z *Rat) SetInt64(x int64) *Rat
  • функция (z *Rat) SetString(s string) (*Rat, bool)
  • функция (z *Rat) SetUint64(x uint64) *Rat
  • функция (x *Rat) Sign() int
  • функция (x *Rat) String() string
  • функция (z *Rat) Sub(x, y *Rat) *Rat
  • функция (z *Rat) UnmarshalText(text []byte) error
  • тип RoundingMode
  • функция (i RoundingMode) String() string
  • тип Word

Примеры

Float.Add
Float.Cmp
Float.Copy
Float.Scan
Float.SetString
Float (Сдвиг)
Int.Scan
Int.SetString
Rat.Scan
Rat.SetString
RoundingMode
Пакет (EConvergents)
Пакет (Fibonacci)
Пакет (Sqrt2)

Файлы пакета

accuracy_string.go arith.go arith_amd64.go arith_decl.go decimal.go doc.go float.go floatconv.go floatmarsh.go ftoa.go int.go intconv.go intmarsh.go nat.go natconv.go natdiv.go prime.go rat.go ratconv.go ratmarsh.go roundingmode_string.go sqrt.go

Константы

Пределы экспоненты и точности.

const (
    MaxExp  = math.MaxInt32  // largest supported exponent
    MinExp  = math.MinInt32  // smallest supported exponent
    MaxPrec = math.MaxUint32 // largest (theoretically) supported precision; likely memory-limited
)

MaxBase — это наибольшая система счисления, принимаемая для преобразований строк.

const MaxBase = 10 + ('z' - 'a' + 1) + ('Z' - 'A' + 1)

func Jacobi 1.5

func Jacobi(x, y *Int) int

Jacobi возвращает символ Якоби (x/y), либо +1, -1, или 0. Аргумент y должен быть нечётным целым числом.

тип Accuracy 1.5

Accuracy описывает погрешность округления, произведённую последней операцией, которая сгенерировала значение Float, относительно точного значения.

type Accuracy int8

Константы, описывающие Accuracy Float.

const (
    Below Accuracy = -1
    Exact Accuracy = 0
    Above Accuracy = +1
)

func (Accuracy) String 1.5

func (i Accuracy) String() string

тип ErrNaN 1.5

Ошибка ErrNaN возникает при выполнении операции Float, которая привела бы к NaN в соответствии с правилами IEEE 754. ErrNaN реализует интерфейс ошибки.

type ErrNaN struct {
    // contains filtered or unexported fields
}

func (ErrNaN) Error 1.5

func (err ErrNaN) Error() string

тип Float 1.5

Неравное нулю конечное Float представляет число с плавающей точкой с многократной точностью

sign × mantissa × 2**exponent

с 0,5 <= мантисса < 1,0 и MinExp <= экспонента <= MaxExp. Float также может быть нулём (+0, -0) или бесконечным (+Inf, -Inf). Все Float упорядочены, и порядок двух Float x и y определяется x.Cmp(y).

Каждое значение Float также имеет точность, режим округления и точность. Точность — это максимальное количество битов мантиссы, доступных для представления значения. Режим округления определяет, как результат должен быть округлен, чтобы поместиться в биты мантиссы, а точность описывает погрешность округления по отношению к точному результату.

Если не указано иное, все операции (включая установщики), которые указывают *Float переменную для результата (обычно через получатель с исключением Float.MantExp), округляют числовой результат в соответствии с точностью и режимом округления переменной результата.

Если указанная точность результата равна 0 (см. ниже), она устанавливается в точность аргумента с наибольшим значением точности перед любым округлением, а режим округления остаётся неизменным. Таким образом, неинициализированные Float, предоставленные в качестве аргументов результата, будут иметь свою точность установленной в разумное значение, определяемое операндами, а их режим — нулевое значение для RoundingMode (ToNearestEven).

Установив желаемую точность в 24 или 53 и используя соответствующий режим округления (обычно ToNearestEven), операции с Float производят те же результаты, что и соответствующая арифметика float32 или float64 IEEE 754 для операндов, соответствующих нормальным (т. е. не денормальным) float32 или float64 числам. Подпороговый и перепороговый экспоненты приводят к 0 или Бесконечности для различных значений, чем IEEE 754, потому что экспоненты Float имеют гораздо больший диапазон.

Нулевое (неинициализированное) значение для Float готово к использованию и представляет число +0,0 точно, с точностью 0 и режимом округления ToNearestEven.

Операции всегда принимают аргументы указателей (*Float), а не значения Float, и каждое уникальное значение Float требует своего собственного уникального указателя *Float. Для «копирования» значения Float необходимо установить существующее (или вновь выделенное) Float в новое значение с помощью метода Float.Set; неглубокие копии Float не поддерживаются и могут привести к ошибкам.

type Float struct {
    // contains filtered or unexported fields
}

Пример (Сдвиг)

Код:

// Implement Float "shift" by modifying the (binary) exponents directly.
for s := -5; s <= 5; s++ {
    x := big.NewFloat(0.5)
    x.SetMantExp(x, x.MantExp(nil)+s) // shift x by s
    fmt.Println(x)
}

Вывод:

0.015625
0.03125
0.0625
0.125
0.25
0.5
1
2
4
8
16

func NewFloat 1.5

func NewFloat(x float64) *Float

NewFloat выделяет и возвращает новый Float, установленный на x, с точностью 53 и режимом округления ToNearestEven. NewFloat вызывает ошибку ErrNaN, если x — NaN.

func ParseFloat 1.5

func ParseFloat(s string, base int, prec uint, mode RoundingMode) (f *Float, b int, err error)

ParseFloat подобен f.Parse(s, base) с установленным f для заданной точности и режима округления.

func (*Float) Abs 1.5

func (z *Float) Abs(x *Float) *Float

Abs устанавливает z в (возможно, округленное) значение |x| (модуль x) и возвращает z.

func (*Float) Acc 1.5

func (x *Float) Acc() Accuracy

Acc возвращает точность x, произведённую последней операцией, если не указано иное в документации к этой операции.

func (*Float) Add 1.5

func (z *Float) Add(x, y *Float) *Float

Add устанавливает z в округленное значение суммы x+y и возвращает z. Если точность z равна 0, она изменяется на большую из точности x или y до операции. Округление выполняется в соответствии с точностью и режимом округления z; и точность z сообщает об ошибке результата относительно точного (не округленного) результата. Add вызывает ошибку ErrNaN, если x и y — бесконечности с противоположными знаками. Значение z в этом случае не определено.

Пример

Код:

// Operate on numbers of different precision.
var x, y, z big.Float
x.SetInt64(1000)          // x is automatically set to 64bit precision
y.SetFloat64(2.718281828) // y is automatically set to 53bit precision
z.SetPrec(32)
z.Add(&x, &y)
fmt.Printf("x = %.10g (%s, prec = %d, acc = %s)\n", &x, x.Text('p', 0), x.Prec(), x.Acc())
fmt.Printf("y = %.10g (%s, prec = %d, acc = %s)\n", &y, y.Text('p', 0), y.Prec(), y.Acc())
fmt.Printf("z = %.10g (%s, prec = %d, acc = %s)\n", &z, z.Text('p', 0), z.Prec(), z.Acc())

Вывод:

x = 1000 (0x.fap+10, prec = 64, acc = Exact)
y = 2.718281828 (0x.adf85458248cd8p+2, prec = 53, acc = Exact)
z = 1002.718282 (0x.faadf854p+10, prec = 32, acc = Below)

func (*Float) Append 1.5

func (x *Float) Append(buf []byte, fmt byte, prec int) []byte

Append добавляет к buf строковое представление числа с плавающей точкой x, сгенерированное x.Text, и возвращает расширенный буфер.

func (*Float) AppendText 1.24

func (x *Float) AppendText(b []byte) ([]byte, error)

AppendText реализует интерфейс encoding.TextAppender. Маршалируется только значение Float (в полной точности), другие атрибуты, такие как точность или точность, игнорируются.

func (*Float) Cmp 1.5

func (x *Float) Cmp(y *Float) int

Cmp сравнивает x и y и возвращает:

  • -1 если x < y;
  • 0 если x == y (включая -0 == 0, -Inf == -Inf и +Inf == +Inf);
  • +1 если x > y.

Пример

Код:

inf := math.Inf(1)
zero := 0.0

operands := []float64{-inf, -1.2, -zero, 0, +1.2, +inf}

fmt.Println("   x     y  cmp")
fmt.Println("---------------")
for _, x64 := range operands {
    x := big.NewFloat(x64)
    for _, y64 := range operands {
        y := big.NewFloat(y64)
        fmt.Printf("%4g  %4g  %3d\n", x, y, x.Cmp(y))
    }
    fmt.Println()
}

Вывод:

   x     y  cmp
---------------
-Inf  -Inf    0
-Inf  -1.2   -1
-Inf    -0   -1
-Inf     0   -1
-Inf   1.2   -1
-Inf  +Inf   -1

-1.2  -Inf    1
-1.2  -1.2    0
-1.2    -0   -1
-1.2     0   -1
-1.2   1.2   -1
-1.2  +Inf   -1

  -0  -Inf    1
  -0  -1.2    1
  -0    -0    0
  -0     0    0
  -0   1.2   -1
  -0  +Inf   -1

   0  -Inf    1
   0  -1.2    1
   0    -0    0
   0     0    0
   0   1.2   -1
   0  +Inf   -1

 1.2  -Inf    1
 1.2  -1.2    1
 1.2    -0    1
 1.2     0    1
 1.2   1.2    0
 1.2  +Inf   -1

+Inf  -Inf    1
+Inf  -1.2    1
+Inf    -0    1
+Inf     0    1
+Inf   1.2    1
+Inf  +Inf    0

func (*Float) Copy 1.5

func (z *Float) Copy(x *Float) *Float

Copy устанавливает z в x с той же точностью, режимом округления и точностью, что и у x. Copy возвращает z. Если x и z идентичны, Copy — это нетранзакционная операция.

Пример

Код:

var x, z big.Float

x.SetFloat64(1.23)
r := z.Copy(&x)
fmt.Printf("a) r = %g, z = %g, x = %g, r == z = %v\n", r, &z, &x, r == &z)

// changing z changes r since they are identical
z.SetInt64(42)
fmt.Printf("b) r = %g, z = %g, r == z = %v\n", r, &z, r == &z)

x.SetPrec(1)
z.Copy(&x)
fmt.Printf("c) z = %g, x = %g, z == x = %v\n", &z, &x, &z == &x)

Вывод:

a) r = 1.23, z = 1.23, x = 1.23, r == z = true
b) r = 42, z = 42, r == z = true
c) z = 1, x = 1, z == x = false

func (*Float) Float32 1.5

func (x *Float) Float32() (float32, Accuracy)

Float32 возвращает значение float32, ближайшее к x. Если x слишком мало, чтобы быть представленным float32 (|x| < math.SmallestNonzeroFloat32), результат — (0, Below) или (-0, Above) соответственно в зависимости от знака x. Если x слишком велик, чтобы быть представленным float32 (|x| > math.MaxFloat32), результат — (+Inf, Above) или (-Inf, Below) соответственно в зависимости от знака x.

func (*Float) Float64 1.5

func (x *Float) Float64() (float64, Accuracy)

Float64 возвращает значение float64, ближайшее к x. Если x слишком мало, чтобы быть представленным float64 (|x| < math.SmallestNonzeroFloat64), результат — (0, Below) или (-0, Above) соответственно в зависимости от знака x. Если x слишком велик, чтобы быть представленным float64 (|x| > math.MaxFloat64), результат — (+Inf, Above) или (-Inf, Below) соответственно в зависимости от знака x.

func (*Float) Format 1.5

func (x *Float) Format(s fmt.State, format rune)

Format реализует fmt.Formatter. Она принимает все стандартные форматы для чисел с плавающей точкой ('b', 'e', 'E', 'f', 'F', 'g', 'G', 'x') а также 'p' и 'v'. См. (*Float).Text для интерпретации 'p'. Формат 'v' обрабатывается как 'g'. Format также поддерживает указание минимальной точности в цифрах, ширины вывода поля, а также флагов форматирования '+' и ' ' для управления знаком, '0' для заполнения пробелами или нулями, и '-' для выравнивания слева или справа. См. пакет fmt для деталей.

func (*Float) GobDecode 1.7

func (z *Float) GobDecode(buf []byte) error

GobDecode реализует интерфейс encoding/gob.GobDecoder. Результат округляется в соответствии с точностью и режимом округления z, если точность z равна 0, в этом случае z устанавливается точно в декодированное значение.

func (*Float) GobEncode 1.7

func (x *Float) GobEncode() ([]byte, error)

GobEncode реализует интерфейс encoding/gob.GobEncoder. Значение Float и все его атрибуты (точность, режим округления, точность) маршаллируются.

func (*Float) Int 1.5

func (x *Float) Int(z *Int) (*Int, Accuracy)

Int возвращает результат усечения x к нулю; или nil, если x — бесконечность. Результат является точным, если x.IsInt(); в противном случае он является ниже для x > 0 и выше для x < 0. Если предоставлен непустой аргумент *Int z, Int сохраняет результат в z вместо выделения нового Int.

func (*Float) Int64 1.5

func (x *Float) Int64() (int64, Accuracy)

Int64 возвращает целое число, полученное в результате усечения x к нулю. Если math.MinInt64 ≤ x ≤ math.MaxInt64, результат является точным, если x — целое число, и выше (x < 0) или ниже (x > 0) в противном случае. Результат равен (math.MinInt64, выше) для x < math.MinInt64 и (math.MaxInt64, ниже) для x > math.MaxInt64.

func (*Float) IsInf 1.5

func (x *Float) IsInf() bool

IsInf сообщает, является ли x +Inf или -Inf.

func (*Float) IsInt 1.5

func (x *Float) IsInt() bool

IsInt сообщает, является ли x целым числом. Значения ±Inf не являются целыми числами.

func (*Float) MantExp 1.5

func (x *Float) MantExp(mant *Float) (exp int)

MantExp разбивает x на компоненты мантиссы и экспоненты и возвращает экспоненту. Если аргумент mant не равен nil, его значение устанавливается в мантиссу x с той же точностью и режимом округления, что и у x. Компоненты удовлетворяют x == mant × 2**exp, где 0.5 ≤ |mant| < 1.0. Вызов MantExp с аргументом nil — это эффективный способ получить экспоненту получателя.

Особые случаи:

(  ±0).MantExp(mant) = 0, with mant set to   ±0
(±Inf).MantExp(mant) = 0, with mant set to ±Inf

x и mant могут быть одинаковыми, в этом случае x устанавливается в его значение мантиссы.

func (*Float) MarshalText 1.6

func (x *Float) MarshalText() (text []byte, err error)

MarshalText реализует интерфейс encoding.TextMarshaler. Только значение Float сериализуется (с полной точностью), другие атрибуты, такие как точность или точность, игнорируются.

func (*Float) MinPrec 1.5

func (x *Float) MinPrec() uint

MinPrec возвращает минимальную точность, необходимую для точного представления x (т. е. наименьшую точность до того, как x.SetPrec(prec) начнёт округлять x). Результат равен 0 для |x| == 0 и |x| == Inf.

func (*Float) Mode 1.5

func (x *Float) Mode() RoundingMode

Mode возвращает режим округления x.

func (*Float) Mul 1.5

func (z *Float) Mul(x, y *Float) *Float

Mul устанавливает z в округленное произведение x*y и возвращает z. Точность, округление и сообщения об точности такие же, как для Float.Add. Mul вызывает панику с ErrNaN, если один из операндов равен нулю, а другой — бесконечности. В этом случае значение z не определено.

func (*Float) Neg 1.5

func (z *Float) Neg(x *Float) *Float

Neg устанавливает z в (возможно, округленное) значение x с инверсированным знаком и возвращает z.

func (*Float) Parse 1.5

func (z *Float) Parse(s string, base int) (f *Float, b int, err error)

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

Для базы 0 символ подчёркивания «_» может появляться между префиксом базы и соседней цифрой, и между последовательными цифрами; такие подчёркивания не изменяют значения числа или возвращаемого количества цифр. Неправильное размещение подчёркиваний отображается как ошибка, если нет других ошибок. Если база ≠ 0, подчёркивания не распознаются и, таким образом, завершают сканирование, как любой другой символ, который не является допустимой точкой раздела или цифрой.

Он устанавливает z в (возможно, округленное) значение соответствующего значения с плавающей запятой и возвращает z, фактическую базу b и ошибку err, если таковая имеется. Для успеха должна быть обработана вся строка (не только префикс). Если точность z равна 0, она изменяется на 64 перед округлением. Число должно иметь вид:

number    = [ sign ] ( float | "inf" | "Inf" ) .
sign      = "+" | "-" .
float     = ( mantissa | prefix pmantissa ) [ exponent ] .
prefix    = "0" [ "b" | "B" | "o" | "O" | "x" | "X" ] .
mantissa  = digits "." [ digits ] | digits | "." digits .
pmantissa = [ "_" ] digits "." [ digits ] | [ "_" ] digits | "." digits .
exponent  = ( "e" | "E" | "p" | "P" ) [ sign ] digits .
digits    = digit { [ "_" ] digit } .
digit     = "0" ... "9" | "a" ... "z" | "A" ... "Z" .

Аргумент базы должен быть 0, 2, 8, 10 или 16. Предоставление недопустимого аргумента базы приведёт к панике во время выполнения.

Для базы 0 префикс числа определяет фактическую базу: префикс «0b» или «0B» выбирает базу 2, «0o» или «0O» выбирает базу 8, а «0x» или «0X» выбирает базу 16. В противном случае фактическая база равна 10, и префикс не принимается. Восьмеричный префикс «0» не поддерживается (ведущая «0» просто рассматривается как «0»).

Экспонента «p» или «P» указывает на базу 2 (а не базу 10) экспоненты; например, «0x1.fffffffffffffp1023» (используя базу 0) представляет максимальное значение float64. Для шестнадцатеричных мантисс символ экспоненты должен быть одним из 'p' или 'P', если он присутствует (индикатор экспоненты «e» или «E» нельзя отличить от цифры мантиссы).

Возвращаемый *Float f равен nil, а значение z является допустимым, но не определённым, если сообщается об ошибке.

func (*Float) Prec 1.5

func (x *Float) Prec() uint

Prec возвращает точность мантиссы x в битах. Результат может быть 0 для |x| == 0 и |x| == Inf.

func (*Float) Quo 1.5

func (z *Float) Quo(x, y *Float) *Float

Quo устанавливает z в округленное частное x/y и возвращает z. Точность, округление и сообщения об точности такие же, как для Float.Add. Quo вызывает панику с ErrNaN, если оба операнда равны нулю или бесконечности. В этом случае значение z не определено.

func (*Float) Rat 1.5

func (x *Float) Rat(z *Rat) (*Rat, Accuracy)

Rat возвращает рациональное число, соответствующее x; или nil, если x — бесконечность. Результат является точным, если x не является Inf. Если предоставлен непустой аргумент *Rat z, Rat сохраняет результат в z вместо выделения нового Rat.

func (*Float) Scan 1.8

func (z *Float) Scan(s fmt.ScanState, ch rune) error

Scan — вспомогательная функция для fmt.Scanner; она устанавливает z в значение отсканированного числа. Она принимает форматы, глаголы которых поддерживаются fmt.Scan для чисел с плавающей запятой, которые являются: 'b' (двоичный), 'e', 'E', 'f', 'F', 'g' и 'G'. Scan не обрабатывает ±Inf.

Пример

Код:

// The Scan function is rarely used directly;
// the fmt package recognizes it as an implementation of fmt.Scanner.
f := new(big.Float)
_, err := fmt.Sscan("1.19282e99", f)
if err != nil {
    log.Println("error scanning value:", err)
} else {
    fmt.Println(f)
}

Вывод:

1.19282e+99

func (*Float) Set 1.5

func (z *Float) Set(x *Float) *Float

Set устанавливает z в (возможно, округленное) значение x и возвращает z. Если точность z равна 0, она изменяется на точность x перед установкой z (и округление не будет иметь эффекта). Округление выполняется в соответствии с точностью и режимом округления z; и точность z сообщает об ошибке результата по отношению к точному (не округленному) результату.

func (*Float) SetFloat64 1.5

func (z *Float) SetFloat64(x float64) *Float

SetFloat64 устанавливает z в (возможно, округленное) значение x и возвращает z. Если точность z равна 0, она изменяется на 53 (и округление не будет иметь эффекта). SetFloat64 вызывает панику с ErrNaN, если x — NaN.

func (*Float) SetInf 1.5

func (z *Float) SetInf(signbit bool) *Float

SetInf устанавливает z в бесконечный Float -Inf, если установлен флаг знака, или +Inf, если флаг знака не установлен, и возвращает z. Точность z не изменяется, и результат всегда точный.

func (*Float) SetInt 1.5

func (z *Float) SetInt(x *Int) *Float

SetInt устанавливает z в (возможно, округленное) значение x и возвращает z. Если точность z равна 0, она изменяется на большее из x.BitLen() или 64 (и округление не будет иметь эффекта).

func (*Float) SetInt64 1.5

func (z *Float) SetInt64(x int64) *Float

SetInt64 устанавливает z в (возможно, округленное) значение x и возвращает z. Если точность z равна 0, она изменяется на 64 (и округление не будет иметь эффекта).

func (*Float) SetMantExp 1.5

func (z *Float) SetMantExp(mant *Float, exp int) *Float

SetMantExp устанавливает z в mant × 2**exp и возвращает z. Результат z имеет ту же точность и режим округления, что и mant. SetMantExp является обратным Float.MantExp, но не требует 0.5 ≤ |mant| < 1.0. В частности, для данного x типа *Float, SetMantExp относится к Float.MantExp следующим образом:

mant := new(Float)
new(Float).SetMantExp(mant, x.MantExp(mant)).Cmp(x) == 0

Особые случаи:

z.SetMantExp(  ±0, exp) =   ±0
z.SetMantExp(±Inf, exp) = ±Inf

z и mant могут быть одинаковыми, в этом случае экспонента z устанавливается в exp.

func (*Float) SetMode 1.5

func (z *Float) SetMode(mode RoundingMode) *Float

SetMode устанавливает режим округления z в mode и возвращает точный z. В противном случае z остаётся без изменений. z.SetMode(z.Mode()) — это дешёвый способ установить точность z на точную.

func (*Float) SetPrec 1.5

func (z *Float) SetPrec(prec uint) *Float

SetPrec устанавливает точность z на prec и возвращает (возможно) округленное значение z. Округление происходит в соответствии с режимом округления z, если мантиссу нельзя представить в prec битах без потери точности. SetPrec(0) отображает все конечные значения на ±0; бесконечные значения остаются неизменными. Если prec > MaxPrec, он устанавливается на MaxPrec.

func (*Float) SetRat 1.5

func (z *Float) SetRat(x *Rat) *Float

SetRat устанавливает z в (возможно, округленное) значение x и возвращает z. Если точность z равна 0, она изменяется на наибольшее из a.BitLen(), b.BitLen() или 64; при x = a/b.

func (*Float) SetString 1.5

func (z *Float) SetString(s string) (*Float, bool)

SetString устанавливает z в значение s и возвращает z и логическое значение, указывающее на успех. s должен быть числом с плавающей запятой в том же формате, что и принимаемое Float.Parse, с аргументом базы 0. Для успеха вся строка (а не только префикс) должна быть корректной. Если операция не удалась, значение z не определено, но возвращаемое значение равно nil.

Пример

Код:

f := new(big.Float)
f.SetString("3.14159")
fmt.Println(f)

Вывод:

3.14159

func (*Float) SetUint64 1.5

func (z *Float) SetUint64(x uint64) *Float

SetUint64 устанавливает z в (возможно, округленное) значение x и возвращает z. Если точность z равна 0, она изменяется на 64 (и округление не будет иметь эффекта).

func (*Float) Sign 1.5

func (x *Float) Sign() int

Sign возвращает:

  • -1, если x < 0;
  • 0, если x равно ±0;
  • +1, если x > 0.

func (*Float) Signbit 1.5

func (x *Float) Signbit() bool

Signbit сообщает, является ли x отрицательным или отрицательным нулём.

func (*Float) Sqrt 1.10

func (z *Float) Sqrt(x *Float) *Float

Sqrt устанавливает z в округленное значение квадратного корня из x и возвращает его.

Если точность z равна 0, она изменяется на точность x перед выполнением операции. Округление выполняется в соответствии с точностью и режимом округления z, но точность z не вычисляется. В частности, результат z.Acc() не определён.

Функция вызывает ошибку, если z < 0. Значение z в этом случае не определено.

func (*Float) String 1.5

func (x *Float) String() string

String форматирует x как x.Text('g', 10). (String необходимо вызывать явно, Float.Format не поддерживает версию %s.)

func (*Float) Sub 1.5

func (z *Float) Sub(x, y *Float) *Float

Sub устанавливает z в округлённую разность x-y и возвращает z. Точность, округление и отчёт о точности такие же, как у Float.Add. Sub вызывает ошибку с ErrNaN, если x и y являются бесконечностями с одинаковыми знаками. Значение z в этом случае не определено.

func (*Float) Text 1.5

func (x *Float) Text(format byte, prec int) string

Text преобразует число с плавающей точкой x в строку в соответствии с заданным форматом и точностью prec. Формат — один из:

'e'	-d.dddde±dd, decimal exponent, at least two (possibly 0) exponent digits
'E'	-d.ddddE±dd, decimal exponent, at least two (possibly 0) exponent digits
'f'	-ddddd.dddd, no exponent
'g'	like 'e' for large exponents, like 'f' otherwise
'G'	like 'E' for large exponents, like 'f' otherwise
'x'	-0xd.dddddp±dd, hexadecimal mantissa, decimal power of two exponent
'p'	-0x.dddp±dd, hexadecimal mantissa, decimal power of two exponent (non-standard)
'b'	-ddddddp±dd, decimal mantissa, decimal power of two exponent (non-standard)

Для форматов экспоненты в степени двойки мантисса печатается в нормализованной форме:

'x'	hexadecimal mantissa in [1, 2), or 0
'p'	hexadecimal mantissa in [½, 1), or 0
'b'	decimal integer mantissa using x.Prec() bits, or 0

Обратите внимание, что форма 'x' используется большинством других языков и библиотек.

Если формат — другой символ, Text возвращает "%" вместе с нераспознанным символом формата.

Точность prec управляет количеством цифр (исключая экспоненту), выводимых форматами 'e', 'E', 'f', 'g', 'G' и 'x'. Для 'e', 'E', 'f' и 'x' это число цифр после десятичной точки. Для 'g' и 'G' — общее число цифр. Отрицательная точность выбирает минимальное количество десятичных цифр, необходимое для однозначной идентификации значения x с использованием битов мантиссы x.Prec(). Значение prec игнорируется для форматов 'b' и 'p'.

func (*Float) Uint64 1.5

func (x *Float) Uint64() (uint64, Accuracy)

Uint64 возвращает целое беззнаковое число, полученное в результате усечения x в сторону нуля. Если 0 ≤ x ≤ math.MaxUint64, результат является Exact, если x является целым числом, и Below в противном случае. Результат — (0, Above) для x < 0 и (math.MaxUint64, Below) для x > math.MaxUint64.

func (*Float) UnmarshalText 1.6

func (z *Float) UnmarshalText(text []byte) error

UnmarshalText реализует интерфейс encoding.TextUnmarshaler. Результат округляется в соответствии с точностью и режимом округления z. Если точность z равна 0, она изменяется на 64 перед округлением.

type Int

Int представляет целое число с фиксированной точностью со знаком. Нулевое значение Int представляет значение 0.

Операции всегда принимают указатели (*Int), а не значения Int, и каждое уникальное значение Int требует своего уникального указателя *Int. Чтобы «скопировать» значение Int, необходимо установить существующее (или вновь выделенное) значение Int с помощью метода Int.Set; неглубокие копии Int не поддерживаются и могут привести к ошибкам.

Обратите внимание, что методы могут раскрывать значение Int через временные каналы. Из-за этого и из-за области и сложности реализации Int не подходит для реализации криптографических операций. Стандартная библиотека избегает экспонирования нетривиальных методов Int для вводимых пользователем данных и определение, считается ли ошибка в math/big уязвимостью в безопасности, может зависеть от влияния на стандартную библиотеку.

type Int struct {
    // contains filtered or unexported fields
}

func NewInt

func NewInt(x int64) *Int

NewInt выделяет и возвращает новый Int, установленный в x.

func (*Int) Abs

func (z *Int) Abs(x *Int) *Int

Abs устанавливает z в |x| (абсолютное значение x) и возвращает z.

func (*Int) Add

func (z *Int) Add(x, y *Int) *Int

Add устанавливает z в сумму x+y и возвращает z.

func (*Int) And

func (z *Int) And(x, y *Int) *Int

And устанавливает z = x & y и возвращает z.

func (*Int) AndNot

func (z *Int) AndNot(x, y *Int) *Int

AndNot устанавливает z = x &^ y и возвращает z.

func (*Int) Append 1.6

func (x *Int) Append(buf []byte, base int) []byte

Append добавляет строковое представление x, сгенерированное x.Text(base), в buf и возвращает расширенный буфер.

func (*Int) AppendText 1.24

func (x *Int) AppendText(b []byte) (text []byte, err error)

AppendText реализует интерфейс encoding.TextAppender.

func (*Int) Binomial

func (z *Int) Binomial(n, k int64) *Int

Binomial устанавливает z в биномиальный коэффициент C(n, k) и возвращает z.

func (*Int) Bit

func (x *Int) Bit(i int) uint

Bit возвращает значение i-го бита x. То есть, возвращает (x>>i)&1. Индекс бита i должен быть >= 0.

func (*Int) BitLen

func (x *Int) BitLen() int

BitLen возвращает длину абсолютного значения x в битах. Длина бита 0 равна 0.

func (*Int) Bits

func (x *Int) Bits() []Word

Bits предоставляет прямой (но не проверенный, но быстрый) доступ к x, возвращая его абсолютное значение в виде little-endian Word среза. Результат и x разделяют один и тот же массив. Bits предназначен для поддержки реализации отсутствующей низкоуровневой функциональности Int вне этого пакета; его следует избегать в противном случае.

func (*Int) Bytes

func (x *Int) Bytes() []byte

Bytes возвращает абсолютное значение x в виде big-endian байтового среза.

Для использования среза фиксированной длины или предварительно выделенного среза используйте Int.FillBytes.

func (*Int) Cmp

func (x *Int) Cmp(y *Int) (r int)

Cmp сравнивает x и y и возвращает:

  • -1, если x < y;
  • 0, если x == y;
  • +1, если x > y.

func (*Int) CmpAbs 1.10

func (x *Int) CmpAbs(y *Int) int

CmpAbs сравнивает абсолютные значения x и y и возвращает:

  • -1, если |x| < |y|;
  • 0, если |x| == |y|;
  • +1, если |x| > |y|.

func (*Int) Div

func (z *Int) Div(x, y *Int) *Int

Div устанавливает z в частное x/y для y != 0 и возвращает z. Если y == 0, возникает ошибка деления на ноль во время выполнения. Div реализует евклидово деление (в отличие от Go); см. Int.DivMod для получения дополнительных сведений.

func (*Int) DivMod

func (z *Int) DivMod(x, y, m *Int) (*Int, *Int)

DivMod устанавливает z в частное x div y и m в остаток x mod y и возвращает пару (z, m) для y != 0. Если y == 0, возникает ошибка деления на ноль во время выполнения.

DivMod реализует евклидово деление и остаток (в отличие от Go):

q = x div y  such that
m = x - y*q  with 0 <= m < |y|

(См. Raymond T. Boute, “The Euclidean definition of the functions div and mod”. ACM Transactions on Programming Languages and Systems (TOPLAS), 14(2):127-144, New York, NY, USA, 4/1992. ACM press.) См. Int.QuoRem для деления и остатка Т (как в Go).

func (*Int) Exp

func (z *Int) Exp(x, y, m *Int) *Int

Exp устанавливает z = x**y mod |m| (т. е. знак m игнорируется) и возвращает z. Если m == nil или m == 0, z = x**y, за исключением случаев, когда y ≤ 0, в этом случае z = 1. Если m != 0, y < 0 и x и m не взаимно просты, z не изменяется, и возвращается nil.

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

func (*Int) FillBytes 1.15

func (x *Int) FillBytes(buf []byte) []byte

FillBytes устанавливает buf в абсолютное значение x, сохраняя его как нулевое расширение big-endian байтового среза, и возвращает buf.

Если абсолютное значение x не помещается в buf, FillBytes вызовет ошибку.

func (*Int) Float64 1.21

func (x *Int) Float64() (float64, Accuracy)

Float64 возвращает ближайшее к x значение float64 и указание на любые произошедшие округления.

func (*Int) Format

func (x *Int) Format(s fmt.State, ch rune)

Format реализует fmt.Formatter. Он принимает форматы 'b' (двоичный), 'o' (восьмеричный с префиксом 0), 'O' (восьмеричный с префиксом 0o), 'd' (десятичный), 'x' (нижняя граница шестнадцатеричного) и 'X' (верхняя граница шестнадцатеричного). Также поддерживаются все флаги формата пакета fmt для целочисленных типов, включая '+' и ' ' для управления знаком, '#' для ведущего нуля в восьмеричной и шестнадцатеричной системе счисления, ведущего "0x" или "0X" для "%#x" и "%#X" соответственно, указание минимальной точности цифр, ширины поля вывода, заполнения пробелом или нулём, и '-' для выравнивания влево или вправо.

func (*Int) GCD

func (z *Int) GCD(x, y, a, b *Int) *Int

GCD устанавливает z в наибольший общий делитель a и b и возвращает z. Если x или y не равны nil, GCD устанавливает их значения таким образом, что z = a*x + b*y.

a и b могут быть положительными, нулевыми или отрицательными. (До версии Go 1.14 оба должны были быть > 0.) Независимо от знаков a и b, z всегда >= 0.

Если a == b == 0, GCD устанавливает z = x = y = 0.

Если a == 0 и b != 0, GCD устанавливает z = |b|, x = 0, y = sign(b) * 1.

Если a != 0 и b == 0, GCD устанавливает z = |a|, x = sign(a) * 1, y = 0.

func (*Int) GobDecode

func (z *Int) GobDecode(buf []byte) error

GobDecode реализует интерфейс encoding/gob.GobDecoder.

func (*Int) GobEncode

func (x *Int) GobEncode() ([]byte, error)

GobEncode реализует интерфейс encoding/gob.GobEncoder.

func (*Int) Int64

func (x *Int) Int64() int64

Int64 возвращает представление x в формате int64. Если x не может быть представлен в int64, результат не определён.

func (*Int) IsInt64 1.9

func (x *Int) IsInt64() bool

IsInt64 сообщает, может ли x быть представлен как int64.

func (*Int) IsUint64 1.9

func (x *Int) IsUint64() bool

IsUint64 сообщает, может ли x быть представлен как uint64.

func (*Int) Lsh

func (z *Int) Lsh(x *Int, n uint) *Int

Lsh устанавливает z = x << n и возвращает z.

func (*Int) MarshalJSON 1.1

func (x *Int) MarshalJSON() ([]byte, error)

MarshalJSON реализует интерфейс encoding/json.Marshaler.

func (*Int) MarshalText 1.3

func (x *Int) MarshalText() (text []byte, err error)

MarshalText реализует интерфейс encoding.TextMarshaler.

func (*Int) Mod

func (z *Int) Mod(x, y *Int) *Int

Метод mod устанавливает z в остаток от деления x на y (x%y), если y != 0, и возвращает z. Если y == 0, возникает ошибка времени выполнения деления на ноль. Mod реализует евклидов остаток (в отличие от Go); см. Int.DivMod для получения более подробной информации.

func (*Int) ModInverse

func (z *Int) ModInverse(g, n *Int) *Int

ModInverse устанавливает z в мультипликативную обратную величину g в кольце ℤ/nℤ и возвращает z. Если g и n не являются взаимно простыми, у g нет мультипликативной обратной величины в кольце ℤ/nℤ. В этом случае z остается неизменным, а возвращаемое значение равно nil. Если n == 0, возникает ошибка времени выполнения деления на ноль.

func (*Int) ModSqrt 1.5

func (z *Int) ModSqrt(x, p *Int) *Int

ModSqrt устанавливает z в квадратный корень из x по модулю p, если такой квадратный корень существует, и возвращает z. Модуль p должен быть нечётным простым числом. Если x не является квадратом по модулю p, ModSqrt оставляет z без изменений и возвращает nil. Данная функция вызывает ошибку, если p не является нечётным целым числом; её поведение не определено, если p нечётно, но не является простым.

func (*Int) Mul

func (z *Int) Mul(x, y *Int) *Int

Mul устанавливает z в произведение x*y и возвращает z.

func (*Int) MulRange

func (z *Int) MulRange(a, b int64) *Int

MulRange устанавливает z в произведение всех целых чисел в диапазоне [a, b] включительно и возвращает z. Если a > b (пустой диапазон), результат равен 1.

func (*Int) Neg

func (z *Int) Neg(x *Int) *Int

Neg устанавливает z в -x и возвращает z.

func (*Int) Not

func (z *Int) Not(x *Int) *Int

Not устанавливает z = ^x и возвращает z.

func (*Int) Or

func (z *Int) Or(x, y *Int) *Int

Or устанавливает z = x | y и возвращает z.

func (*Int) ProbablyPrime

func (x *Int) ProbablyPrime(n int) bool

ProbablyPrime сообщает, является ли x, вероятно, простым числом, применяя тест Миллера—Рабина с n псевдослучайными основаниями, а также тест Балли—ПСВ.

Если x является простым числом, ProbablyPrime возвращает true. Если x выбран случайным образом и не является простым, ProbablyPrime, вероятно, вернёт false. Вероятность возвращения true для случайно выбранного не простого числа не превышает ¼ⁿ.

ProbablyPrime имеет 100% точность для входных данных меньше 2⁶⁴. Дополнительную информацию об ошибках см. в книге Menezes et al., «Справочник по прикладной криптографии», 1997, стр. 145-149, и в приложении F к FIPS 186-4.

ProbablyPrime не подходит для проверки простых чисел, которые могут быть сконструированы противником для обмана теста.

Начиная с Go 1.8, ProbablyPrime(0) разрешен и применяет только тест Балли—ПСВ. До Go 1.8 ProbablyPrime применял только тесты Миллера—Рабина, и ProbablyPrime(0) вызывал ошибку.

func (*Int) Quo

func (z *Int) Quo(x, y *Int) *Int

Quo устанавливает z в частное x/y для y != 0 и возвращает z. Если y == 0, возникает ошибка времени выполнения деления на ноль. Quo реализует усеченное деление (как в Go); см. Int.QuoRem для получения более подробной информации.

func (*Int) QuoRem

func (z *Int) QuoRem(x, y, r *Int) (*Int, *Int)

QuoRem устанавливает z в частное x/y и r в остаток x%y и возвращает пару (z, r) для y != 0. Если y == 0, возникает ошибка времени выполнения деления на ноль.

QuoRem реализует T-деление и модуль (как в Go):

q = x/y      with the result truncated to zero
r = x - y*q

(См. Daan Leijen, «Деление и модуль для специалистов по вычислительной технике».) См. Int.DivMod для евклидова деления и модуля (в отличие от Go).

func (*Int) Rand

func (z *Int) Rand(rnd *rand.Rand, n *Int) *Int

Rand устанавливает z в псевдослучайное число в [0, n) и возвращает z.

Поскольку для этого используется пакет math/rand, его нельзя использовать для работы, связанной с безопасностью. Используйте crypto/rand.Int вместо этого.

func (*Int) Rem

func (z *Int) Rem(x, y *Int) *Int

Rem устанавливает z в остаток x%y для y != 0 и возвращает z. Если y == 0, возникает ошибка времени выполнения деления на ноль. Rem реализует усечённый модуль (как в Go); см. Int.QuoRem для получения более подробной информации.

func (*Int) Rsh

func (z *Int) Rsh(x *Int, n uint) *Int

Rsh устанавливает z = x >> n и возвращает z.

func (*Int) Scan

func (z *Int) Scan(s fmt.ScanState, ch rune) error

Scan — вспомогательная функция для fmt.Scanner; она устанавливает z в значение прочитанного числа. Она принимает форматы 'b' (двоичный), 'o' (восьмеричный), 'd' (десятичный), 'x' (нижний регистр шестнадцатеричный) и 'X' (верхний регистр шестнадцатеричный).

Пример

Код:

// The Scan function is rarely used directly;
// the fmt package recognizes it as an implementation of fmt.Scanner.
i := new(big.Int)
_, err := fmt.Sscan("18446744073709551617", i)
if err != nil {
    log.Println("error scanning value:", err)
} else {
    fmt.Println(i)
}

Вывод:

18446744073709551617

func (*Int) Set

func (z *Int) Set(x *Int) *Int

Set устанавливает z в x и возвращает z.

func (*Int) SetBit

func (z *Int) SetBit(x *Int, i int, b uint) *Int

SetBit устанавливает z в x, с i-м битом x, установленным на b (0 или 1). То есть,

  • если b равно 1, SetBit устанавливает z = x | (1 << i);
  • если b равно 0, SetBit устанавливает z = x &^ (1 << i);
  • если b не равно 0 или 1, SetBit вызовет ошибку.

func (*Int) SetBits

func (z *Int) SetBits(abs []Word) *Int

SetBits обеспечивает прямой (непроверенный, но быстрый) доступ к z, устанавливая его значение в abs, интерпретированное как срез little-endian Word, и возвращает z. Результат и abs делят один и тот же массив. SetBits предназначен для поддержки реализации отсутствующей низкоуровневой функциональности Int за пределами этого пакета; его следует избегать в остальных случаях.

func (*Int) SetBytes

func (z *Int) SetBytes(buf []byte) *Int

SetBytes интерпретирует buf как байты большого неподписанного целого числа, устанавливает z в это значение и возвращает z.

func (*Int) SetInt64

func (z *Int) SetInt64(x int64) *Int

SetInt64 устанавливает z в x и возвращает z.

func (*Int) SetString

func (z *Int) SetString(s string, base int) (*Int, bool)

SetString устанавливает z в значение s, интерпретируемое в заданном основании, и возвращает z и булево значение, указывающее на успех. Для успеха вся строка (а не только префикс) должна быть корректной. Если SetString завершается ошибкой, значение z не определено, но возвращаемое значение равно nil.

Аргумент base должен быть 0 или значением от 2 до MaxBase. Для base 0 префикс числа определяет фактическое основание: префикс «0b» или «0B» выбирает основание 2, «0», «0o» или «0O» выбирает основание 8, а «0x» или «0X» выбирает основание 16. В противном случае выбранное основание равно 10, и префикс не принимается.

Для оснований ≤ 36 строчные и прописные буквы рассматриваются одинаково: буквы 'a' до 'z' и 'A' до 'Z' представляют значения цифр от 10 до 35. Для оснований > 36 прописные буквы 'A' до 'Z' представляют значения цифр от 36 до 61.

Для основания 0 символ подчеркивания «_» может появляться между префиксом основания и соседней цифрой, и между соседними цифрами; такие подчеркивания не изменяют значение числа. Неверное размещение подчеркиваний сообщается как ошибка, если нет других ошибок. Если base != 0, подчеркивания не распознаются и действуют как любой другой символ, который не является допустимой цифрой.

Пример

Код:

i := new(big.Int)
i.SetString("644", 8) // octal
fmt.Println(i)

Вывод:

420

func (*Int) SetUint64 1.1

func (z *Int) SetUint64(x uint64) *Int

SetUint64 устанавливает z в x и возвращает z.

func (*Int) Sign

func (x *Int) Sign() int

Sign возвращает:

  • -1, если x < 0;
  • 0, если x == 0;
  • +1, если x > 0.

func (*Int) Sqrt 1.8

func (z *Int) Sqrt(x *Int) *Int

Sqrt устанавливает z в ⌊√x⌋, наибольшее целое число, такое что z² ≤ x, и возвращает z. Возникает ошибка, если x отрицательно.

func (*Int) String

func (x *Int) String() string

String возвращает десятичное представление x, сгенерированное x.Text(10).

func (*Int) Sub

func (z *Int) Sub(x, y *Int) *Int

Sub устанавливает z в разность x-y и возвращает z.

func (*Int) Text 1.6

func (x *Int) Text(base int) string

Text возвращает строковое представление x в заданном основании. Основание должно быть от 2 до 62 включительно. Результат использует строчные буквы 'a' до 'z' для значений цифр от 10 до 35 и прописные буквы 'A' до 'Z' для значений цифр от 36 до 61. Префиксов (таких как "0x") в строке нет. Если x является указателем на nil, возвращается "<nil>".

func (*Int) TrailingZeroBits 1.13

func (x *Int) TrailingZeroBits() uint

TrailingZeroBits возвращает количество последовательных младших нулевых битов |x|.

func (*Int) Uint64 1.1

func (x *Int) Uint64() uint64

Uint64 возвращает представление x как uint64. Если x не может быть представлен в uint64, результат не определён.

func (*Int) UnmarshalJSON 1.1

func (z *Int) UnmarshalJSON(text []byte) error

UnmarshalJSON реализует интерфейс encoding/json.Unmarshaler.

func (*Int) UnmarshalText 1.3

func (z *Int) UnmarshalText(text []byte) error

UnmarshalText реализует интерфейс encoding.TextUnmarshaler.

func (*Int) Xor

func (z *Int) Xor(x, y *Int) *Int

Xor устанавливает z = x ^ y и возвращает z.

type Rat

Rat представляет собой дробь a/b произвольной точности. Нулевое значение для Rat представляет значение 0.

Операции всегда принимают аргументы указателей (*Rat) вместо значений Rat, и каждое уникальное значение Rat требует собственного уникального указателя *Rat. Чтобы «скопировать» значение Rat, необходимо установить новое значение существующему (или новому) Rat, используя метод Rat.Set; поверхностные копии Rat не поддерживаются и могут привести к ошибкам.

type Rat struct {
    // contains filtered or unexported fields
}

func NewRat

func NewRat(a, b int64) *Rat

NewRat создаёт новый Rat с числителем a и знаменателем b.

func (*Rat) Abs

func (z *Rat) Abs(x *Rat) *Rat

Abs устанавливает z в |x| (модуль x) и возвращает z.

func (*Rat) Add

func (z *Rat) Add(x, y *Rat) *Rat

Add устанавливает z в сумму x+y и возвращает z.

func (*Rat) AppendText 1.24

func (x *Rat) AppendText(b []byte) ([]byte, error)

AppendText реализует интерфейс encoding.TextAppender.

func (*Rat) Cmp

func (x *Rat) Cmp(y *Rat) int

Cmp сравнивает x и y и возвращает:

  • -1, если x < y;
  • 0, если x == y;
  • +1, если x > y.

func (*Rat) Denom

func (x *Rat) Denom() *Int

Denom возвращает знаменатель x; он всегда > 0. Результат является ссылкой на знаменатель x, если x — неинициализированное (нулевое) значение Rat, в этом случае результат — новый Int со значением 1. (Для инициализации x подойдёт любая операция, которая устанавливает x, включая x.Set(x)). Если результат — ссылка на знаменатель x, он может измениться при присвоении нового значения x, и наоборот.

func (*Rat) Float32 1.4

func (x *Rat) Float32() (f float32, exact bool)

Float32 возвращает ближайшее значение float32 для x и булево значение, указывающее, представляет ли f значение x точно. Если абсолютное значение x слишком велико, чтобы быть представленным float32, f является бесконечностью, а exact — ложью. Знак f всегда соответствует знаку x, даже если f == 0.

func (*Rat) Float64 1.1

func (x *Rat) Float64() (f float64, exact bool)

Float64 возвращает ближайшее значение float64 для x и булево значение, указывающее, представляет ли f значение x точно. Если абсолютное значение x слишком велико, чтобы быть представленным float64, f является бесконечностью, а exact — ложью. Знак f всегда соответствует знаку x, даже если f == 0.

func (*Rat) FloatPrec 1.22

func (x *Rat) FloatPrec() (n int, exact bool)

FloatPrec возвращает количество n не повторяющихся цифр, непосредственно следующих за десятичной точкой в десятичном представлении x. Булево значение результата указывает, является ли десятичное представление x с таким количеством дробных цифр точным или округленным.

Примеры:

x      n    exact    decimal representation n fractional digits
0      0    true     0
1      0    true     1
1/2    1    true     0.5
1/3    0    false    0       (0.333... rounded)
1/4    2    true     0.25
1/6    1    false    0.2     (0.166... rounded)

func (*Rat) FloatString

func (x *Rat) FloatString(prec int) string

FloatString возвращает строковое представление x в десятичной форме с prec цифрами точности после десятичной точки. Последняя цифра округляется до ближайшего значения, причём половины округляются в сторону от нуля.

func (*Rat) GobDecode

func (z *Rat) GobDecode(buf []byte) error

GobDecode реализует интерфейс encoding/gob.GobDecoder.

func (*Rat) GobEncode

func (x *Rat) GobEncode() ([]byte, error)

GobEncode реализует интерфейс encoding/gob.GobEncoder.

func (*Rat) Inv

func (z *Rat) Inv(x *Rat) *Rat

Inv устанавливает z в 1/x и возвращает z. Если x == 0, Inv вызывает панику.

func (*Rat) IsInt

func (x *Rat) IsInt() bool

IsInt сообщает, является ли знаменатель x равным 1.

func (*Rat) MarshalText 1.3

func (x *Rat) MarshalText() (text []byte, err error)

MarshalText реализует интерфейс encoding.TextMarshaler.

func (*Rat) Mul

func (z *Rat) Mul(x, y *Rat) *Rat

Mul устанавливает z в произведение x*y и возвращает z.

func (*Rat) Neg

func (z *Rat) Neg(x *Rat) *Rat

Neg устанавливает z в -x и возвращает z.

func (*Rat) Num

func (x *Rat) Num() *Int

Num возвращает числитель x; он может быть <= 0. Результат является ссылкой на числитель x; он может измениться, если x получит новое значение, и наоборот. Знак числителя соответствует знаку x.

func (*Rat) Quo

func (z *Rat) Quo(x, y *Rat) *Rat

Quo устанавливает z в частное x/y и возвращает z. Если y == 0, Quo вызывает панику.

func (*Rat) RatString

func (x *Rat) RatString() string

RatString возвращает строковое представление x в форме "a/b", если b != 1, и в форме "a", если b == 1.

func (*Rat) Scan

func (z *Rat) Scan(s fmt.ScanState, ch rune) error

Scan — вспомогательная функция для fmt.Scanner. Она принимает форматы 'e', 'E', 'f', 'F', 'g', 'G' и 'v'. Все форматы эквивалентны.

Пример

Код:

// The Scan function is rarely used directly;
// the fmt package recognizes it as an implementation of fmt.Scanner.
r := new(big.Rat)
_, err := fmt.Sscan("1.5000", r)
if err != nil {
    log.Println("error scanning value:", err)
} else {
    fmt.Println(r)
}

Вывод:

3/2

func (*Rat) Set

func (z *Rat) Set(x *Rat) *Rat

Set устанавливает z в x (создавая копию x) и возвращает z.

func (*Rat) SetFloat64 1.1

func (z *Rat) SetFloat64(f float64) *Rat

SetFloat64 устанавливает z точно в f и возвращает z. Если f не является конечным, SetFloat возвращает nil.

func (*Rat) SetFrac

func (z *Rat) SetFrac(a, b *Int) *Rat

SetFrac устанавливает z в a/b и возвращает z. Если b == 0, SetFrac вызывает панику.

func (*Rat) SetFrac64

func (z *Rat) SetFrac64(a, b int64) *Rat

SetFrac64 устанавливает z в a/b и возвращает z. Если b == 0, SetFrac64 вызывает панику.

func (*Rat) SetInt

func (z *Rat) SetInt(x *Int) *Rat

SetInt устанавливает z в x (создавая копию x) и возвращает z.

func (*Rat) SetInt64

func (z *Rat) SetInt64(x int64) *Rat

SetInt64 устанавливает z в x и возвращает z.

func (*Rat) SetString

func (z *Rat) SetString(s string) (*Rat, bool)

SetString устанавливает z в значение s и возвращает z и булево значение, указывающее на успех. s может быть задан как (возможно, со знаком) дробь "a/b" или как число с плавающей точкой, необязательно с показателем степени. Если задана дробь, и числитель, и знаменатель могут быть целым десятичным числом или использовать префикс "0b", "0", "0o" или "0x" (или их заглавные аналоги) для обозначения двоичного, восьмеричного или шестнадцатеричного целого числа соответственно. Знаменатель не может быть со знаком. Если задано число с плавающей точкой, оно может быть в десятичном формате или использовать любые из тех же префиксов, что и для "0", для обозначения мантиссы, не являющейся десятичной. Ведущая "0" рассматривается как десятичный ведущий 0; в этом случае это не указывает на восьмеричное представление. Также может быть предоставлен необязательный десятичный показатель степени "e" или двоичный "p" (или их заглавные аналоги), за исключением шестнадцатеричных чисел с плавающей точкой, которые принимают только (необязательный) показатель степени "p" (потому что "e" или "E" не могут быть отличимы от цифры мантиссы). Если абсолютное значение показателя степени слишком велико, операция может завершиться неудачей. Вся строка, а не только префикс, должна быть допустимой для успеха. Если операция завершилась неудачей, значение z не определено, но возвращаемое значение — nil.

Пример

Код:

r := new(big.Rat)
r.SetString("355/113")
fmt.Println(r.FloatString(3))

Вывод:

3.142

func (*Rat) SetUint64 1.13

func (z *Rat) SetUint64(x uint64) *Rat

SetUint64 устанавливает z в x и возвращает z.

func (*Rat) Sign

func (x *Rat) Sign() int

Sign возвращает:

  • -1, если x < 0;
  • 0, если x == 0;
  • +1, если x > 0.

func (*Rat) String

func (x *Rat) String() string

String возвращает строковое представление x в форме "a/b" (даже если b == 1).

func (*Rat) Sub

func (z *Rat) Sub(x, y *Rat) *Rat

Sub устанавливает z в разность x-y и возвращает z.

func (*Rat) UnmarshalText 1.3

func (z *Rat) UnmarshalText(text []byte) error

UnmarshalText реализует интерфейс encoding.TextUnmarshaler.

type RoundingMode 1.5

RoundingMode определяет, как значение Float округляется до желаемой точности. Округление может изменить значение Float; ошибка округления описывается Float's Accuracy.

type RoundingMode byte

Эти константы определяют поддерживаемые режимы округления.

const (
    ToNearestEven RoundingMode = iota // == IEEE 754-2008 roundTiesToEven
    ToNearestAway                     // == IEEE 754-2008 roundTiesToAway
    ToZero                            // == IEEE 754-2008 roundTowardZero
    AwayFromZero                      // no IEEE 754-2008 equivalent
    ToNegativeInf                     // == IEEE 754-2008 roundTowardNegative
    ToPositiveInf                     // == IEEE 754-2008 roundTowardPositive
)

Пример

Код:

operands := []float64{2.6, 2.5, 2.1, -2.1, -2.5, -2.6}

fmt.Print("   x")
for mode := big.ToNearestEven; mode <= big.ToPositiveInf; mode++ {
    fmt.Printf("  %s", mode)
}
fmt.Println()

for _, f64 := range operands {
    fmt.Printf("%4g", f64)
    for mode := big.ToNearestEven; mode <= big.ToPositiveInf; mode++ {
        // sample operands above require 2 bits to represent mantissa
        // set binary precision to 2 to round them to integer values
        f := new(big.Float).SetPrec(2).SetMode(mode).SetFloat64(f64)
        fmt.Printf("  %*g", len(mode.String()), f)
    }
    fmt.Println()
}

Вывод:

   x  ToNearestEven  ToNearestAway  ToZero  AwayFromZero  ToNegativeInf  ToPositiveInf
 2.6              3              3       2             3              2              3
 2.5              2              3       2             3              2              3
 2.1              2              2       2             3              2              3
-2.1             -2             -2      -2            -3             -3             -2
-2.5             -2             -3      -2            -3             -3             -2
-2.6             -3             -3      -2            -3             -3             -2

func (RoundingMode) String 1.5

func (i RoundingMode) String() string

type Word

Word представляет собой одну цифру многоразрядного беззнакового целого числа.

type Word uint

© Google, Inc.
Licensed under the Creative Commons Attribution License 3.0.
http://golang.org/pkg/math/big/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API