Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

libretto/num

64-битное целое число (libretto/num/I64)

Структура libretto/num/I64 представляет 64-битное знаковое целое число. С ним возможно использование операций +, -, *, idiv.

use libretto/num

def main = {
  fix i1 = num/i64(777)
  fix i2 = num/i64(123)
  println: i1 + i2
  println: i2 - i1
  println: i1 * i2
  println: i1 idiv i2
}

Выдает:

900
-654
95571
6

При помощи метода libretto/num/i64 определяются литералы, аргумент должен быть литералом libretto/Int. Другие методы преобразования определены в пакете libretto/num:

def Int i64: I64
def I64 int: Int

Битовые операции с libretto/num/I64, определенные методами в пакете libretto/num:

def I64 and(v: I64): I64
def I64 or(v: I64): I64
def I64 xor(v: I64): I64
def I64 not: I64
def I64 `>>>`(v: I64): I64 // беззнаковый битовый сдвиг
def I64 `>>`(v: I64): I64 // знаковый битовый сдвиг
def I64 `<<`(v: I64): I64 //

Пример использования:

use libretto/num

def binary(v: num/I64) = {
  fix one = num/i64(1)
  var acc = v
  var res: String = ""
  0..63.${
    res = (if (acc.and(one) == one) "1" else "0") + res
    acc = acc.`>>>`(one)
  }
  println(res)
}


def main = {
  fix minI64 = num/i64(-9_223_372_036_854_775_808)
  fix maxI64 = num/i64(9_223_372_036_854_775_807)
  fix one = num/i64(1)
  binary(minI64)
  binary(maxI64)
  binary(one)
  println()
  binary(minI64.not)
  binary(maxI64.not)
  binary(one.not)
  println()
  binary(minI64.or(maxI64))
  binary(minI64.and(maxI64))
  binary(maxI64.and(one))
  binary(maxI64.xor(one))
  println()
  binary(one.`<<`(num/i64(3)))
  binary(minI64.`>>`(num/i64(3)))
  binary(minI64.`>>>`(num/i64(3)))  
}

Результат:

1000000000000000000000000000000000000000000000000000000000000000
0111111111111111111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000000000000000001

0111111111111111111111111111111111111111111111111111111111111111
1000000000000000000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111111111111111110

1111111111111111111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000001
0111111111111111111111111111111111111111111111111111111111111110

0000000000000000000000000000000000000000000000000000000000001000
1111000000000000000000000000000000000000000000000000000000000000
0001000000000000000000000000000000000000000000000000000000000000

64-битное вещественное число (libretto/num/R64)

Структура libretto/num/R64 представляет собой 64-битное знаковое вещественное число (IEEE 754). С ним возможно использование операций +, -, *, div

use libretto/num

def main = {
  fix i1 = num/r64(7.77)
  fix i2 = num/r64(1.23)
  println: i1 + i2
  println: i2 - i1
  println: i1 * i2
  println: i1 div i2
}

Выдает:

9.0
-6.539999999999999
9.5571
6.317073170731707

При помощи метода libretto/num/r64 определяются литералы, аргумент должен быть литералом libretto/Real. Другие методы преобразования определены в пакете `libretto/num:

def Real r64: R64
def Int r64: R64
def I64 r64: R64
def R64 real: Real

Операции с libretto/num/R64, определенные в пакете libretto/num:

def R64 sqrt: R64
def R64 log: R64
def R64 exp: R64
def R64 pow(p: R64): R64