Skip to main content

Overview

The gen class is the fundamental type in Giac, representing polymorphic algebraic objects. It can hold integers, floating-point numbers, complex numbers, symbolic expressions, vectors, matrices, and more. Defined in: src/giac/headers/gen.h

Type System

The gen class uses a type field to distinguish between different value types:
class gen {
public:
  unsigned char type;      // Type identifier
  signed char subtype;     // Subtype information
  unsigned short reserved; // Used for 64-bit pointers
  union {
    int val;              // Immediate integer
    double _DOUBLE_val;   // Immediate double (if DOUBLEVAL)
    // ... pointer types for complex objects
  };
};

Type Constants

From dispatch.h:
_INT_
type
Integer type (immediate value)
_DOUBLE_
type
Double-precision floating point
_FLOAT_
type
Single-precision float
_ZINT
type
Arbitrary precision integer (GMP mpz_t)
_CPLX
type
Complex number
_REAL
type
Arbitrary precision real (MPFR)
_FRAC
type
Rational number (fraction)
_SYMB
type
Symbolic expression
_VECT
type
Vector or list
_IDNT
type
Identifier (variable name)
_POLY
type
Polynomial
_STRNG
type
String
_FUNC
type
Function pointer

Constructors

Default Constructor

gen();
Creates a gen initialized to 0.

Integer Constructors

gen(int i);
gen(long i);
gen(longlong i);
gen(const mpz_t & m);
Create gen from various integer types.
gen a(42);           // int
gen b(1000000000L);  // long
gen c("12345678901234567890", contextptr); // Large integer from string

Floating-Point Constructors

gen(double d);
gen(const giac_float & f);
Create gen from floating-point values.
gen x(3.14159);
gen y(2.718281828);

Complex Constructors

gen(int a, int b);              // a + bi
gen(double a, double b);        // a + bi
gen(const gen & a, const gen & b); // a + bi
gen(const std::complex<double> & c);
Create complex numbers.
gen i(0, 1);           // i = sqrt(-1)
gen z(3.0, 4.0);       // 3 + 4i
gen w = gen(1, 2);     // 1 + 2i

Vector Constructor

gen(const vecteur & v, short int s = 0);
Create gen from a vector. The subtype s can specify special vector types.
vecteur v = {gen(1), gen(2), gen(3)};
gen vec(v);  // Vector [1, 2, 3]

Symbolic Constructor

gen(const symbolic & s);
Create gen from a symbolic expression.

String Constructor

gen(const std::string & s, GIAC_CONTEXT);
gen(const char * s, GIAC_CONTEXT);
Parse a string to create a gen.
gen expr("x^2 + 2*x + 1", contextptr);
gen val("3.14159", contextptr);

Core Methods

Evaluation

gen eval(int level, const context * contextptr) const;
Evaluate the expression to the specified depth level.
level
int
Evaluation depth (typically DEFAULT_EVAL_LEVEL)
contextptr
const context *
Evaluation context
return
gen
Evaluated result
gen x = gen("x", contextptr);
gen expr = x * x + 2 * x + 1;
gen result = expr.eval(DEFAULT_EVAL_LEVEL, contextptr);

Floating-Point Evaluation

gen evalf(int level, const context * contextptr) const;
gen evalf_double(int level, const context * contextptr) const;
Evaluate to floating-point approximation.
  • evalf() - Returns arbitrary precision if available
  • evalf_double() - Forces double precision
gen pi = gen("pi", contextptr);
gen approx = pi.evalf(1, contextptr);  // 3.14159265359...

Type Conversion

int to_int() const;
double to_double(const context * contextptr) const;
Convert gen to native C++ types.
gen x(42);
int n = x.to_int();        // 42

gen y(3.14);
double d = y.to_double(contextptr);  // 3.14

Type Checking

bool is_integer() const;
bool is_cinteger() const;  // Complex integer
bool is_real(GIAC_CONTEXT) const;
bool is_constant() const;
bool is_approx() const;
Check the type of a gen.
gen x(42);
if (x.is_integer()) {
  // x is an integer
}

gen y(3.14);
if (y.is_approx()) {
  // y is approximate (floating-point)
}

Arithmetic Operators

The gen class overloads standard C++ operators:
gen operator + (const gen & a, const gen & b);
gen operator - (const gen & a, const gen & b);
gen operator - (const gen & a);  // Unary minus
gen operator * (const gen & a, const gen & b);
gen operator / (const gen & a, const gen & b);
gen operator % (const gen & a, const gen & b);
gen a(5), b(3);
gen sum = a + b;      // 8
gen diff = a - b;     // 2
gen prod = a * b;     // 15
gen quot = a / b;     // 5/3 (rational)
gen neg = -a;         // -5

Compound Assignment

gen & operator += (gen & a, const gen & b);
gen & operator -= (gen & a, const gen & b);

Comparison Operators

bool operator == (const gen & a, const gen & b);
bool operator != (const gen & a, const gen & b);
bool operator > (const gen & a, const gen & b);
bool operator < (const gen & a, const gen & b);
gen a(5), b(3);
if (a > b) {
  // 5 > 3 is true
}

Complex Number Operations

gen conj(GIAC_CONTEXT) const;          // Complex conjugate
gen re(GIAC_CONTEXT) const;            // Real part
gen im(GIAC_CONTEXT) const;            // Imaginary part
gen squarenorm(GIAC_CONTEXT) const;    // |z|^2
gen z(3.0, 4.0);  // 3 + 4i
gen conj_z = z.conj(contextptr);  // 3 - 4i
gen re_z = z.re(contextptr);      // 3
gen im_z = z.im(contextptr);      // 4
gen norm = z.squarenorm(contextptr); // 25

Vector/Matrix Operations

Indexing

gen operator [] (int i) const;
gen operator [] (const gen & i) const;
Access vector/matrix elements (0-indexed).
vecteur v = {gen(1), gen(2), gen(3)};
gen vec(v);
gen elem = vec[0];  // 1

Function Application

gen operator () (const gen & i, GIAC_CONTEXT) const;
Apply a function gen to arguments.

Advanced Methods

Normal Form

gen inverse(GIAC_CONTEXT) const;
Compute the multiplicative inverse.

Printing

std::string print(GIAC_CONTEXT) const;
const char * dbgprint() const;
Convert gen to string representation.
gen x("x^2 + 1", contextptr);
std::string str = x.print(contextptr);
std::cout << str << std::endl;  // "x^2+1"

Memory Management

The gen class uses reference counting for heap-allocated types:
volatile ref_count_t & ref_count() const;
  • Simple types (integers, doubles) are stored inline
  • Complex types use reference-counted pointers
  • Copy-on-write semantics for efficiency

Size and Dimensions

bool is_vector_of_size(size_t n) const;
int symb_size() const;
Check dimensions and size.

Helper Functions

bool is_zero(const gen & a, GIAC_CONTEXT);
bool is_one(const gen & a);
bool is_minus_one(const gen & a);
bool is_inf(const gen & e);
bool is_undef(const gen & e);
Global helper functions for common checks.
gen x(0);
if (is_zero(x, contextptr)) {
  // x is zero
}

See Also

Build docs developers (and LLMs) love