An object of the class Quotient<NT> is an element of the field of quotients of the integral domain type NT. If NT behaves like an integer, Quotient<NT> behaves like a rational number. LEDA's class rational (see Section 4.5) has been the basis for Quotient<NT>. A Quotient<NT> q is represented as a pair of NTs, representing numerator and denominator.

NT must be at least model of concept IntegralDomainWithoutDivision.
NT must be a model of concept RealEmbeddable.

#include <CGAL/Quotient.h>

Is Model for the Concepts



Quotient<NT> q;
introduces an uninitialized variable q.

template <class T>
Quotient<NT> q ( T t);
introduces the quotient t/1. NT needs to have a constructor from T.

template <class T>
Quotient<NT> q ( Quotient<T> t);
introduces the quotient NT(t.numerator())/NT(t.denominator()). NT needs to have a constructor from T.

Quotient<NT> q ( NT n, NT d);
introduces the quotient n/d.
Precondition: d 0.


There are two access functions, namely to the numerator and the denominator of a quotient. Note that these values are not uniquely defined. It is guaranteed that q.numerator() and q.denominator() return values nt_num and nt_den such that q = nt_num/nt_den, only if q.numerator() and q.denominator() are called consecutively wrt q, i.e. q is not involved in any other operation between these calls.

NT q.numerator () returns a numerator of q.
NT q.denominator () returns a denominator of q.

The stream operations are available as well. They assume that corresponding stream operators for type NT exist.

std::ostream& std::ostream& out << q writes q to ostream out in format ``n/d'', where n==q.numerator() and d==q.denominator().

std::istream& std::istream& in >> & q reads q from istream in. Expected format is ``n/d'', where n and d are of type NT. A single n which is not followed by a / is also accepted and interpreted as n/1.

The following functions are added to fulfill the CGAL requirements on number types.

double to_double ( q) returns some double approximation to q.
bool is_valid ( q) returns true, if numerator and denominator are valid.
bool is_finite ( q) returns true, if numerator and denominator are finite.
Quotient<NT> sqrt ( q) returns the square root of q. This is supported if and only if NT supports the square root as well.