next up previous contents index
Next: Floating-point numbers Up: Numbers Previous: Numbers

Integers

In integer.cecil:


abstract object integer isa num; 
method =(l@:integer,r@:integer):bool; 
method <(l@:integer,r@:integer):bool;
implementation +(l@:integer,r@:integer):integer; 
implementation -(l@:integer,r@:integer):integer;
implementation *(l@:integer,r@:integer):integer; 
implementation /(l@:integer,r@:integer):integer; 
method mod(l@:integer,r@integer:`T <= integer):T;
- modulus 
signature %(integer, `T <= integer):T;
- same as

mod
 
implementation %(l@:integer,r@:integer):integer; 
signature rem(integer, `T <= integer):T;
- remainder 
implementation rem(l@:integer,r@:integer):integer; 
method -_ov(l@:integer):integer;
method +_ov(l@:integer,r@:integer):integer; 
method -_ov(l@:integer,r@:integer):integer;
method *_ov(l@:integer,r@:integer):integer; 
method /_ov(l@:integer,r@:integer):integer; 
method %_ov(l@:integer,r@:integer):integer; 
method <<(l@:integer,r@:integer):integer;
- left shift
method >>(l@:integer,r@:integer):integer;
- right arithmetic shift (extends sign)
method <<_ov(l@:integer,r@:integer):integer;
method >>_ov(l@:integer,r@:integer):integer;
method bit_and (l@:integer, r@:integer):integer; 
method bit_or (l@:integer, r@:integer):integer; 
method bit_xor (l@:integer, r@:integer):integer; 
method bit_xnor (l@:integer, r@:integer):integer; 
method bit_not(l@:integer):integer; 
method get_bit(i@:integer, bit@:integer):integer;
- extract

ith bit (0 or 1)
 
method set_bit(i@:integer, bit@:integer):integer;
- set

ith bit to 1
 
method clear_bit(i@:integer, bit@:integer):integer;
- set

ith bit to 0
 
method as_int(l@integer:`T <= integer):T; 
method as_small_int(l@:integer):int; 
signature as_small_int(integer, if_overflow:&():`T):int|T; 
method as_small_int_if_possible(l@:integer):integer; 
method is_int8(val@:integer):bool; 
method as_int8(val@:integer, if_overflow:&():integer):integer; 
method log_base(x@:integer, base@:integer):int;
- compute logarithm to nearest integer; rounds up 
method exact_log_base(x@:integer, base@:integer, 
if_not_exact:&():int):int;
- compute logarithm, but invoke closure if integer result not exact
method is_even(i@:integer):bool;
- test parity 
method is_odd(i@:integer):bool; 
method hash(i@:integer, range:`T <= integer):S 
where signature %(integer, T):`Q, signature abs(Q):`S;
signature average(integer,integer):integer; 
         Integers are numbers, supporting all the operations of numbers. The normal +, -, *, and / operations do not trap overflow; the +_ov, etc. functions transparently coerce to arbitrary-precision integers if overflow happens. The bitwise operations assume two's complement representation.


method round_up(i:integer, nearest:integer):integer; 
signature round_up(int, int):int; 
method round_down(i:integer, nearest:integer):integer; 
signature round_down(int, int):int; 
method factorial(n:integer):integer; 
method fibonacci(n:integer):integer; 
method fibonacci_recursive(n:integer):integer; 
round_up rounds toward positive infinity, while round_down rounds toward negative infinity. Both ignore the sign of their second argument.


method do_digits_increasing(i@:integer, c:&(digit:int,position:int):void):void; 
method do_digits_increasing_base(i@:integer, base:int, 
c:&(digit:int,position:int):void):void;
method print_string(i@:integer):string; 
method print_string_base(i@:integer, base:int):string; 
method print_string_base(i@:int, base:int):string; 
method print_string(i@:integer, len:int):string; 
do_digits_increasing calls its closure on each digit from least to most significant; the position argument indicates the digit's significance and starts at zero.

In small-int.cecil:


extend int isa integer; 
method = (l@:int, r@:int):bool; 
method < (l@:int, r@:int):bool;
method <_unsigned (l@:int, r@:int):bool;
method <= (l@:int, r@:int):bool;
method <=_unsigned (l@:int, r@:int):bool;
method > (l@:int, r@:int):bool;
method >_unsigned (l@:int, r@:int):bool;
method >= (l@:int, r@:int):bool;
method >=_unsigned (l@:int, r@:int):bool;
method != (l@:int, r@:int):bool;
implementation + (l@:int, r@:int):int; 
implementation - (l@:int, r@:int):int;
implementation * (l@:int, r@:int):int; 
implementation / (l@:int, r@:int):int; 
implementation % (l@:int, r@:int):int; 
method negate_ov (l@:int, if_overflow:&():`T):int|T; 
method add_ov (l@:int, r@:int, if_overflow:&():`T):int|T; 
method sub_ov (l@:int, r@:int, if_overflow:&():`T):int|T; 
method mul_ov (l@:int, r@:int, if_overflow:&():`T):int|T; 
method div_ov (l@:int, r@:int, if_overflow:&():`T):int|T; 
method mod_ov (l@:int, r@:int, if_overflow:&():`T):int|T; 
method -_ov(l@:int):integer;
method +_ov (l@:int, r@:int):integer; 
method -_ov (l@:int, r@:int):integer;
method *_ov (l@:int, r@:int):integer; 
method /_ov (l@:int, r@:int):integer; 
method %_ov (l@:int, r@:int):integer; 
method as_single_float(l@:int):single_float; 
method as_double_float(l@:int):double_float; 
method bit_and (l@:int, r@:int):int; 
method bit_or (l@:int, r@:int):int; 
method bit_xor (l@:int, r@:int):int; 
method bit_not(l@:int):int; 
method << (l@:int, r@:int):int;
method >> (l@:int, r@:int):int;
method >>_logical (l@:int, r@:int):int;
- right logical shift (no sign-extension)
method get_bit(i@:int, bit@:int):int; 
method set_bit(i@:int, bit@:int):int; 
method clear_bit(i@:int, bit@:int):int; 
method is_even(i@:int):bool; 
method sqrt(x@:int):int; 
signature average(int,int):int; 
signature pred(int):int; 
signature succ(int):int; 
method as_small_int(l@:int, if_overflow:&():`T):int; 
                Small integers ( int) are the main representation of integers.


method do(count@:int, c:&(int):void):void; 
method print_string(i@:int):string; 
let num_int_bits:int;
- number of bits in small int representation 
let max_int:int;
- maximum small int 
let min_int:int;
- minimum small int 
do on integers is a simple kind of for-loop. Expression n.do(&(i:int){...}) invokes the argument closure n times, binding i to each of the numbers from 0 to n-1 in turn; it does not return a value.

In big-int.cecil:


template object big_int isa integer; 
method =(l@:big_int, r@:big_int):bool; 
method < (l@:big_int, r@:big_int):bool;
method <=(l@:big_int, r@:big_int):bool;
method >=(l@:big_int, r@:big_int):bool;
method > (l@:big_int, r@:big_int):bool;
method compare(l@:big_int, r@:big_int,  
if_less:&():`T, if_equal:&():`T, if_greater:&():`T
):T;
method -(l@:big_int):big_int;
method +(l@:big_int, r@:big_int):big_int; 
method -(l@:big_int, r@:big_int):big_int;
method *(l@:big_int, r@:big_int):big_int; 
method /(l@:big_int, r@:big_int):big_int; 
method %(l@:big_int, r@:big_int):big_int; 
method %(l@:big_int, r@:int):int; 
method <<(l@:big_int, r@:integer):integer;
method >>(l@:big_int, r@:integer):integer;
method as_small_int(l@:big_int, if_overflow:&():`T):int|T; 
signature as_big_int(integer):big_int; 
implementation as_big_int(l@:big_int):big_int; 
implementation as_big_int(l@:int):big_int; 
method as_single_float(l@:big_int):single_float; 
method as_double_float(l@:big_int):double_float; 
method print_string_base(x@:big_int, base:int):string; 
         Big integers are an arbitrary-precision representation of integers.


next up previous contents index
Next: Floating-point numbers Up: Numbers Previous: Numbers

The Cecil project