A Discrete-Event Network Simulator
API
High Precision Q64.64

Functions and class for high precision Q64.64 fixed point arithmetic. More...

+ Collaboration diagram for High Precision Q64.64:

Files

file  cairo-wideint-private.h
 cairo_x function declarations, which provide the fallback high precision arithmetic implementation.
 
file  cairo-wideint.c
 Implementation of the cairo_x functions which implement high precision arithmetic.
 
file  int64x64-128.cc
 Implementation of the ns3::int64x64_t type using a native int128_t type.
 
file  int64x64-128.h
 Declaration of the ns3::int64x64_t type using a native int128_t type.
 
file  int64x64-cairo.cc
 Implementation of the ns3::int64x64_t type using the Cairo implementation.
 
file  int64x64-cairo.h
 Declaration of the ns3::int64x64_t type using the Cairo implementation.
 
file  int64x64-double.h
 Declaration and implementation of the ns3::int64x64_t type using the double type.
 
file  int64x64.cc
 Implementation of the streaming input and output operators for the ns3::int64x64_t type.
 
file  int64x64.h
 Declaration of the ns3::int64x64_t type and associated operators.
 

Classes

class  ns3::int64x64_t
 High precision numerical type, implementing Q64.64 fixed precision. More...
 

Macros

#define HEXHILOW(hi, lo)
 Print the high and low words of an int64x64 in hex, for debugging. More...
 

Functions

int64x64_t ns3::Abs (const int64x64_t &value)
 Absolute value. More...
 
int64x64_t ns3::Max (const int64x64_t &a, const int64x64_t &b)
 Maximum. More...
 
int64x64_t ns3::Min (const int64x64_t &a, const int64x64_t &b)
 Minimum. More...
 
int64x64_t ns3::operator! (const int64x64_t &lhs)
 Logical not operator. More...
 
bool ns3::operator!= (const int64x64_t &lhs, const int64x64_t &rhs)
 Inequality operator. More...
 
int64x64_t ns3::operator* (const int64x64_t &lhs, const int64x64_t &rhs)
 Multiplication operator. More...
 
int64x64_tns3::operator*= (int64x64_t &lhs, const int64x64_t &rhs)
 Compound multiplication operator. More...
 
int64x64_t ns3::operator+ (const int64x64_t &lhs, const int64x64_t &rhs)
 Addition operator. More...
 
int64x64_t ns3::operator+ (const int64x64_t &lhs)
 Unary plus operator. More...
 
int64x64_tns3::operator+= (int64x64_t &lhs, const int64x64_t &rhs)
 Compound addition operator. More...
 
int64x64_t ns3::operator- (const int64x64_t &lhs, const int64x64_t &rhs)
 Subtraction operator. More...
 
int64x64_t ns3::operator- (const int64x64_t &lhs)
 Unary negation operator (change sign operator). More...
 
int64x64_tns3::operator-= (int64x64_t &lhs, const int64x64_t &rhs)
 Compound subtraction operator. More...
 
int64x64_t ns3::operator/ (const int64x64_t &lhs, const int64x64_t &rhs)
 Division operator. More...
 
int64x64_tns3::operator/= (int64x64_t &lhs, const int64x64_t &rhs)
 Compound division operator. More...
 
bool ns3::operator< (const int64x64_t &lhs, const int64x64_t &rhs)
 Less than operator. More...
 
std::ostream & ns3::operator<< (std::ostream &os, const int64x64_t &value)
 Output streamer for int64x64_t. More...
 
bool ns3::operator<= (const int64x64_t &lhs, const int64x64_t &rhs)
 Less or equal operator. More...
 
bool ns3::operator== (const int64x64_t &lhs, const int64x64_t &rhs)
 Equality operator. More...
 
bool ns3::operator> (const int64x64_t &lhs, const int64x64_t &rhs)
 Greater operator. More...
 
bool ns3::operator>= (const int64x64_t &lhs, const int64x64_t &rhs)
 Greater or equal operator. More...
 
std::istream & ns3::operator>> (std::istream &is, int64x64_t &value)
 Input streamer for int64x64_t. More...
 
static bool ns3::output_sign (const int128_t sa, const int128_t sb, uint128_t &ua, uint128_t &ub)
 Compute the sign of the result of multiplying or dividing Q64.64 fixed precision operands. More...
 
static bool ns3::output_sign (const cairo_int128_t sa, const cairo_int128_t sb, cairo_uint128_t &ua, cairo_uint128_t &ub)
 Compute the sign of the result of multiplying or dividing Q64.64 fixed precision operands. More...
 
static uint64_t ns3::ReadHiDigits (std::string str)
 Read the integer portion of a number from a string containing just the integral digits (no decimal point or fractional part). More...
 
static uint64_t ns3::ReadLoDigits (std::string str)
 Read the fractional part of a number from a string containing just the decimal digits of the fractional part (no integral part or decimal point). More...
 

Detailed Description

Functions and class for high precision Q64.64 fixed point arithmetic.

A Q64.64 fixed precision number consists of:

Bits Function
1 Sign bit
63 Integer portion
64 Fractional portion

The high word consists of the sign bit and integer value; the low word is the fractional part, unscaled.

All standard arithmetic operations are supported:

Category Operators
Computation +, +=, -, -=, *, *=, /, /=
Comparison ==, !=, <, <=, >, >=
Unary +, -, !

Macro Definition Documentation

◆ HEXHILOW

#define HEXHILOW (   hi,
  lo 
)
Value:
std::hex << std::setfill ('0') << std::right << " (0x" \
<< std::setw (16) << hi << " " \
<< std::setw (16) << lo \
<< std::dec << std::setfill (' ') << std::left << ")"

Print the high and low words of an int64x64 in hex, for debugging.

Parameters
[in]hiThe high (integer) word.
[in]loThe low (fractional) work.

Definition at line 49 of file int64x64.cc.

Referenced by ns3::operator<<().

Function Documentation

◆ Abs()

◆ Max()

◆ Min()

◆ operator!()

int64x64_t ns3::operator! ( const int64x64_t lhs)
inline

Logical not operator.

Parameters
[in]lhsLeft hand argument
Returns
The result of the operator.

Definition at line 511 of file int64x64-128.h.

References ns3::int64x64_t::_v.

◆ operator!=()

bool ns3::operator!= ( const int64x64_t lhs,
const int64x64_t rhs 
)
inline

Inequality operator.

Parameters
[in]lhsLeft hand argument
[in]rhsRight hand argument
Returns
The result of the operator.

Definition at line 144 of file int64x64.h.

◆ operator*()

int64x64_t ns3::operator* ( const int64x64_t lhs,
const int64x64_t rhs 
)
inline

Multiplication operator.

Parameters
[in]lhsLeft hand argument
[in]rhsRight hand argument
Returns
The result of the operator.

Definition at line 117 of file int64x64.h.

◆ operator*=()

int64x64_t & ns3::operator*= ( int64x64_t lhs,
const int64x64_t rhs 
)
inline

Compound multiplication operator.

Parameters
[in]lhsLeft hand argument
[in]rhsRight hand argument
Returns
The result of the operator.

Definition at line 467 of file int64x64-128.h.

References ns3::int64x64_t::Mul().

+ Here is the call graph for this function:

◆ operator+() [1/2]

int64x64_t ns3::operator+ ( const int64x64_t lhs,
const int64x64_t rhs 
)
inline

Addition operator.

Parameters
[in]lhsLeft hand argument
[in]rhsRight hand argument
Returns
The result of the operator.

Definition at line 89 of file int64x64.h.

◆ operator+() [2/2]

int64x64_t ns3::operator+ ( const int64x64_t lhs)
inline

Unary plus operator.

Parameters
[in]lhsLeft hand argument
Returns
The result of the operator.

Definition at line 491 of file int64x64-128.h.

◆ operator+=()

int64x64_t & ns3::operator+= ( int64x64_t lhs,
const int64x64_t rhs 
)
inline

Compound addition operator.

Parameters
[in]lhsLeft hand argument
[in]rhsRight hand argument
Returns
The result of the operator.

Definition at line 443 of file int64x64-128.h.

References ns3::int64x64_t::_v.

◆ operator-() [1/2]

int64x64_t ns3::operator- ( const int64x64_t lhs,
const int64x64_t rhs 
)
inline

Subtraction operator.

Parameters
[in]lhsLeft hand argument
[in]rhsRight hand argument
Returns
The result of the operator.

Definition at line 103 of file int64x64.h.

◆ operator-() [2/2]

int64x64_t ns3::operator- ( const int64x64_t lhs)
inline

Unary negation operator (change sign operator).

Unary operator.

Unary negation operator (change sign operator)

Parameters
[in]lhsLeft hand argument
Returns
The result of the operator.

Definition at line 501 of file int64x64-128.h.

References ns3::int64x64_t::_v.

◆ operator-=()

int64x64_t & ns3::operator-= ( int64x64_t lhs,
const int64x64_t rhs 
)
inline

Compound subtraction operator.

Parameters
[in]lhsLeft hand argument
[in]rhsRight hand argument
Returns
The result of the operator.

Definition at line 455 of file int64x64-128.h.

References ns3::int64x64_t::_v.

◆ operator/()

int64x64_t ns3::operator/ ( const int64x64_t lhs,
const int64x64_t rhs 
)
inline

Division operator.

Parameters
[in]lhsLeft hand argument
[in]rhsRight hand argument
Returns
The result of the operator.

Definition at line 131 of file int64x64.h.

◆ operator/=()

int64x64_t & ns3::operator/= ( int64x64_t lhs,
const int64x64_t rhs 
)
inline

Compound division operator.

Parameters
[in]lhsLeft hand argument
[in]rhsRight hand argument
Returns
The result of the operator.

Definition at line 479 of file int64x64-128.h.

References ns3::int64x64_t::Div().

+ Here is the call graph for this function:

◆ operator<()

bool ns3::operator< ( const int64x64_t lhs,
const int64x64_t rhs 
)
inline

Less than operator.

Parameters
[in]lhsLeft hand argument
[in]rhsRight hand argument
Returns
The result of the operator.

Definition at line 420 of file int64x64-128.h.

References ns3::int64x64_t::_v.

◆ operator<<()

std::ostream & ns3::operator<< ( std::ostream &  os,
const int64x64_t value 
)

Output streamer for int64x64_t.

Internal:
This algorithm is exact to the precision requested, up to the full 64 decimal digits required to exactly represent a 64-bit fraction.

Proper rounding turns out to be surprisingly hard. In y.xxxx5|6, where the | marks follows the last output digit, rounding the 5|6 to 6| is straightforward. However, rounding y.xxx99|6 should result in y.xx100|. Notice the effect of rounding percolates to higher digits. We accumulate the output digits in a string, then carry out the rounding in the string directly.

Values are printed with the following format flags (independent of the stream flags):

  • showpos
  • left

The stream width is ignored. If floatfield is set, precision decimal places are printed. If floatfield is not set, all digits of the fractional part are printed, up to the representation limit of 20 digits; trailing zeros are omitted.

Parameters
[in,out]osThe output stream.
[in]valueThe numerical value to print.
Returns
The stream.

Definition at line 69 of file int64x64.cc.

References ns3::int64x64_t::GetHigh(), ns3::int64x64_t::GetLow(), HEXHILOW, NS_ASSERT_MSG, and NS_LOG_LOGIC.

+ Here is the call graph for this function:

◆ operator<=()

bool ns3::operator<= ( const int64x64_t lhs,
const int64x64_t rhs 
)
inline

Less or equal operator.

Parameters
[in]lhsLeft hand argument
[in]rhsRight hand argument
Returns
The result of the operator.

Definition at line 155 of file int64x64.h.

◆ operator==()

bool ns3::operator== ( const int64x64_t lhs,
const int64x64_t rhs 
)
inline

Equality operator.

Arithmetic operator.

Parameters
[in]lhsLeft hand argument
[in]rhsRight hand argument
Returns
The result of the operator.

Definition at line 409 of file int64x64-128.h.

References ns3::int64x64_t::_v.

◆ operator>()

bool ns3::operator> ( const int64x64_t lhs,
const int64x64_t rhs 
)
inline

Greater operator.

Parameters
[in]lhsLeft hand argument
[in]rhsRight hand argument
Returns
The result of the operator.

Definition at line 431 of file int64x64-128.h.

References ns3::int64x64_t::_v.

◆ operator>=()

bool ns3::operator>= ( const int64x64_t lhs,
const int64x64_t rhs 
)
inline

Greater or equal operator.

Parameters
[in]lhsLeft hand argument
[in]rhsRight hand argument
Returns
The result of the operator.

Definition at line 166 of file int64x64.h.

◆ operator>>()

std::istream & ns3::operator>> ( std::istream &  is,
int64x64_t value 
)

Input streamer for int64x64_t.

Parameters
[in,out]isThe input stream.
[out]valueThe numerical value to set.
Returns
The stream.

Definition at line 222 of file int64x64.cc.

References ns3::ReadHiDigits(), and ns3::ReadLoDigits().

+ Here is the call graph for this function:

◆ output_sign() [1/2]

static bool ns3::output_sign ( const int128_t  sa,
const int128_t  sb,
uint128_t ua,
uint128_t ub 
)
inlinestatic

Compute the sign of the result of multiplying or dividing Q64.64 fixed precision operands.

Parameters
[in]saThe signed value of the first operand.
[in]sbThe signed value of the second operand.
[out]uaThe unsigned magnitude of the first operand.
[out]ubThe unsigned magnitude of the second operand.
Returns
true if the result will be negative.

Definition at line 51 of file int64x64-128.cc.

Referenced by ns3::int64x64_t::Div(), and ns3::int64x64_t::Mul().

+ Here is the caller graph for this function:

◆ output_sign() [2/2]

static bool ns3::output_sign ( const cairo_int128_t  sa,
const cairo_int128_t  sb,
cairo_uint128_t &  ua,
cairo_uint128_t &  ub 
)
inlinestatic

Compute the sign of the result of multiplying or dividing Q64.64 fixed precision operands.

Parameters
[in]saThe signed value of the first operand.
[in]sbThe signed value of the second operand.
[out]uaThe unsigned magnitude of the first operand.
[out]ubThe unsigned magnitude of the second operand.
Returns
True if the result will be negative.

Definition at line 59 of file int64x64-cairo.cc.

References _cairo_int128_negative, _cairo_int128_to_uint128, and _cairo_uint128_negate().

+ Here is the call graph for this function:

◆ ReadHiDigits()

static uint64_t ns3::ReadHiDigits ( std::string  str)
static

Read the integer portion of a number from a string containing just the integral digits (no decimal point or fractional part).

Parameters
[in]strThe string representation of the integral part of a number, with no fractional part or decimal point.
Returns
The integer.

Definition at line 180 of file int64x64.cc.

Referenced by ns3::operator>>().

+ Here is the caller graph for this function:

◆ ReadLoDigits()

static uint64_t ns3::ReadLoDigits ( std::string  str)
static

Read the fractional part of a number from a string containing just the decimal digits of the fractional part (no integral part or decimal point).

Parameters
[in]strThe string representation of the fractional part of a number, without integral part or decimal point.
Returns
The decimal portion of the input number.

Definition at line 203 of file int64x64.cc.

References ns3::int64x64_t::GetLow(), and NS_ASSERT_MSG.

Referenced by ns3::operator>>().

+ Here is the call graph for this function:
+ Here is the caller graph for this function: