44 const size_t num_size = mpz_sizeinbase(mpq_numref(
q_), 10);
45 const size_t den_size = mpz_sizeinbase(mpq_denref(
q_), 10);
47 return num_size + den_size + 3;
56 if( mpz_sgn( mpq_denref(
q_ ) ) != 1 )
60 mpz_gcd( g, mpq_numref(
q_), mpq_denref(
q_) );
61 int rv = mpz_cmp_si( g, 1 );
76 SOQ(
const mpq_t p_q ) {
84 SOQ(
const __int128 p_num,
const __int128 p_den ) {
91 mpq_canonicalize(
q_ );
104 [[nodiscard]]
SOQ *
dup()
const override {
return new SOQ(
q_ ); }
108 mpq_get_str( buffer, 10,
q_ );
109 std::string str( buffer );
116 std::string
type()
const override {
return "rationaltype"; }
118 bool equal(
const SO * p_other )
const override {
119 auto o =
dynamic_cast<const SOQ*
>( p_other );
120 return o ? mpq_equal(
q_,
o->q_) :
false;
123 bool gt(
const SO * p_other )
const override {
124 auto o =
dynamic_cast<const SOQ*
>( p_other );
127 return mpq_cmp(
q_,
o->q_) > 0;
130 bool ge(
const SO * p_other )
const override {
131 auto o =
dynamic_cast<const SOQ*
>( p_other );
134 return mpq_cmp(
q_,
o->q_) >= 0;
152 mpz_set( p_z, mpq_numref(
q_) );
157 mpz_set( mpq_numref(
q_), p_z );
158 mpq_canonicalize(
q_ );
178 return mpz_cmp_ui( mpq_numref(
q_), 1u ) == 0;
184 return mpz_cmp_ui( mpq_denref(
q_), 1u ) == 0;
189 void divqr( mpq_t p_q, mpq_t p_r )
const {
190 mpz_set_ui( mpq_denref( p_q ), 1u );
191 mpz_set( mpq_denref( p_r ), mpq_denref(
q_ ) );
192 mpz_fdiv_qr( mpq_numref(p_q), mpq_numref(p_r), mpq_numref(
q_), mpq_denref(
q_) );
202 if( mpq_set_str(
q_, p_str.c_str(), 10 ) != 0 )
204 if( mpz_sgn( mpq_denref(
q_ ) ) == 0 )
206 mpq_canonicalize(
q_ );
228 if( mpz_sgn( mpq_numref(
q_ ) ) == 0 )
238 __float128
flt128()
const;
void __int128_to_mpz_t(mpz_t p_dst, __int128 p_src)
Converts an __int128 into a mpz_t.
Definition adapter128.cpp:184
bool mpz_t_to___int128(__int128 &p_dst, const mpz_t p_src)
Converts a mpz_t into an __int128.
Definition adapter128.cpp:146
Adapters for 128 bit versions of standard functions.
Semantic Object Rational Number.
Definition soq.h:38
std::string opequal() const override
For operators '=', 'cvs' and 'stack'.
Definition soq.h:106
SOQ(const mpq_t p_q)
Ctor.
Definition soq.h:76
void getNumerator(mpz_t p_z) const
Set the parameter to our numerator value.
Definition soq.h:151
SOQ(const __int128 p_num, const __int128 p_den)
Ctor.
Definition soq.h:84
void reciprocal()
Inplace reciprocal.
Definition soq.h:227
void abs()
Inplace abs.
Definition soq.h:213
bool gt(const SO *p_other) const override
Greater than.
Definition soq.h:123
std::string type() const override
Returns a type name.
Definition soq.h:116
OTCode ot() const override
Returns an OTCode.
Definition soq.h:114
void setNumerator(mpz_t p_z)
Replaces numerator.
Definition soq.h:156
bool isinteger() const
Checks denominator == 1.
Definition soq.h:183
bool getComponents(__int128 &p_num, __int128 &p_den) const
Set the parameters to numerator and denominator.
Definition soq.h:166
SOQ * dup() const override
Creates a new instance as copy following the red book definition.
Definition soq.h:104
bool parse(std::string p_str)
Parses the string for a presentation of a rational.
Definition soq.h:201
~SOQ()
Dtor.
Definition soq.h:97
void divqr(mpq_t p_q, mpq_t p_r) const
Calculates quotient and remainder.
Definition soq.h:189
bool ge(const SO *p_other) const override
Greater or equal.
Definition soq.h:130
size_t str_length() const
Size of the string representation in characters.
Definition soq.h:43
bool invariant() const noexcept override
Checks class invariants.
Definition soq.h:55
void neg()
Inplace neg.
Definition soq.h:220
void getRational(mpq_t p_q) const
Set the parameter to our value.
Definition soq.h:139
void setRational(const mpq_t p_q)
Replaces the rational by the parameter.
Definition soq.h:144
bool equal(const SO *p_other) const override
Equality.
Definition soq.h:118
SOQ()
Ctor.
Definition soq.h:69
bool isunitfraction() const
Checks numerator == 1.
Definition soq.h:177
mpq_t q_
The rational number by GMP.
Definition soq.h:40
__float128 flt128() const
A real representation of the rational.
Definition soq.cpp:30
Semantic Object.
Definition so.h:58
Helpers for design by contract idioms.
#define DBC_INV_CTOR(T)
Assert for invariant checks in ctors and dtors.
Definition dbc.h:89
#define DBC_INV
Assert for invariant checks in member functions.
Definition dbc.h:84
void opErrExit(OpError p_err, const std::string &p_details, const std::source_location p_location)
Operator error message to interpreter cout_ and exit( EC_OPERATOR ).
Definition error.cpp:31
@ undefinedresult
PS operator error undefinedresult.
Definition error.h:37
@ typecheck
PS operator error typecheck.
Definition error.h:34
@ undefined
PS operator error undefined.
Definition error.h:38
Miscellaneous definitions and functions.
The class SO - semantic object.
OTCode
OTCode - the Object Type Code.
Definition so.h:33