src/core/model/int64x64-double.h
author Peter D. Barnes, Jr. <barnes26@llnl.gov>
Sun, 02 Mar 2014 01:02:23 -0800
changeset 10637 67601c471c22
parent 10597 6e1bd685bcaa
child 10645 59fab9f0fdb7
permissions -rw-r--r--
[Bug 1856] int64x64_t double conversions
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
7048
a6d78cb50f6e early work to make python bindings work again with ns-3-time
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7045
diff changeset
     1
#include "ns3/core-config.h"
a6d78cb50f6e early work to make python bindings work again with ns-3-time
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7045
diff changeset
     2
#if !defined(INT64X64_DOUBLE_H) && (defined (INT64X64_USE_DOUBLE) || defined(PYTHON_SCAN))
7039
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7032
diff changeset
     3
#define INT64X64_DOUBLE_H
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     4
10597
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
     5
#include <stdint.h>
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
     6
#include <cmath>  // pow
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
     7
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     8
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     9
namespace ns3 {
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    10
10597
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    11
/**
10637
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
    12
 * \internal
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
    13
 * The implementation documented here uses native long double.
10597
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    14
 */
7039
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7032
diff changeset
    15
class int64x64_t
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    16
{
10597
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    17
  /// Mask for fraction part
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    18
  static const uint64_t    HP_MASK_LO = 0xffffffffffffffffULL;
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    19
  /**
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    20
   * Floating point value of HP_MASK_LO + 1
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    21
   * We really want:
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    22
   * \code
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    23
   *   static const long double HP_MAX_64 = std:pow (2.0L, 64);
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    24
   * \endcode
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    25
   * but we can't call functions in const definitions,
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    26
   * We could make this a static and initialize in int64x64-double.cc or
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    27
   * int64x64.cc, but this requires handling static initialization order
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    28
   * when most of the implementation is inline.  Instead, we resort to
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    29
   * this define.
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    30
   */
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    31
#define HP_MAX_64    (std::pow (2.0L, 64))
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    32
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    33
public:
10597
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    34
  /**
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    35
   * Type tag for the underlying implementation.
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    36
   *
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    37
   * A few testcases are are sensitive to implementation,
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    38
   * specifically the double implementation.  To handle this,
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    39
   * we expose the underlying implementation type here.
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    40
   */
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    41
  enum impl_type {
10637
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
    42
    int128_impl,  //!< Native int128_t implementation.
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
    43
    cairo_impl,   //!< cairo wideint implementation
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
    44
    ld_impl,      //!< long double implementation
10597
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    45
  };
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    46
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    47
  /// Type tag for this implementation.
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    48
  static const enum impl_type implementation = ld_impl;
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    49
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    50
  /// Default constructor
7039
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7032
diff changeset
    51
  inline int64x64_t ()
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    52
    : _v (0) {}
10597
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    53
  /**@{*/
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    54
  /**
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    55
   * Construct from a floating point value.
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    56
   *
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    57
   * \param [in] v floating value to represent
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    58
   */
7043
1a8ff65327d0 fix double build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7041
diff changeset
    59
  inline int64x64_t (double v)
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    60
    : _v (v) {}
10597
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    61
  inline int64x64_t (long double v)
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    62
    : _v (v) {}
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    63
  /**@}*/
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    64
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    65
  /**@{*/
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    66
  /**
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    67
   * Construct from an integral type.
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    68
   *
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    69
   * \param [in] v integer value to represent
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    70
   */
7043
1a8ff65327d0 fix double build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7041
diff changeset
    71
  inline int64x64_t (int v)
1a8ff65327d0 fix double build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7041
diff changeset
    72
    : _v (v) {}
1a8ff65327d0 fix double build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7041
diff changeset
    73
  inline int64x64_t (long int v)
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    74
    : _v (v) {}
7043
1a8ff65327d0 fix double build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7041
diff changeset
    75
  inline int64x64_t (long long int v)
1a8ff65327d0 fix double build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7041
diff changeset
    76
    : _v (v) {}
1a8ff65327d0 fix double build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7041
diff changeset
    77
  inline int64x64_t (unsigned int v)
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    78
    : _v (v) {}
7043
1a8ff65327d0 fix double build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7041
diff changeset
    79
  inline int64x64_t (unsigned long int v)
1a8ff65327d0 fix double build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7041
diff changeset
    80
    : _v (v) {}
1a8ff65327d0 fix double build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7041
diff changeset
    81
  inline int64x64_t (unsigned long long int v)
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    82
    : _v (v) {}
10597
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    83
  /**@}*/
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    84
  /**
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    85
   * Construct from explicit high and low values.
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    86
   *
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    87
   * \param [in] hi Integer portion.
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    88
   * \param [in] lo Fractional portion, already scaled to HP_MAX_64.
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    89
   */
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    90
  explicit inline int64x64_t (int64_t hi, uint64_t lo)
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    91
  {
10637
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
    92
    const bool negative = hi < 0;
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
    93
    const long double fhi = negative ? -hi : hi;
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
    94
    const long double flo = lo / HP_MAX_64;
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
    95
    _v = negative ? - fhi : fhi;
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
    96
    _v += flo;
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
    97
    // _v = negative ? -_v : _v;
10597
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
    98
  }
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    99
10597
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   100
  /**
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   101
   * Copy constructor.
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   102
   *
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   103
   * \param [in] o Value to copy.
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   104
   */
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   105
  inline int64x64_t (const int64x64_t & o)
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   106
    : _v (o._v) {}
10597
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   107
  /**
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   108
   * Assignment.
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   109
   *
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   110
   * \param [in] o Value to assign to this int64x64_t.
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   111
   */
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   112
  inline int64x64_t & operator = (const int64x64_t & o)
7169
358f71a624d8 core coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 7048
diff changeset
   113
  {
358f71a624d8 core coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 7048
diff changeset
   114
    _v = o._v;
358f71a624d8 core coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 7048
diff changeset
   115
    return *this;
358f71a624d8 core coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 7048
diff changeset
   116
  }
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   117
10597
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   118
  /**
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   119
   * Get this value as a double.
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   120
   *
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   121
   * \return This value in floating form.
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   122
   */
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   123
  inline double GetDouble (void) const
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   124
  {
10597
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   125
    return (double)_v;
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   126
  }
10637
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   127
private:
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   128
  /**
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   129
   * Get the high and low portions of this value.
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   130
   *
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   131
   * \return a pair of the high and low words
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   132
   */
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   133
  std::pair<int64_t, uint64_t> GetHighLow (void) const
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   134
    {
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   135
    const bool negative = _v < 0;
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   136
    const long double v = negative ? -_v : _v;
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   137
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   138
    long double fhi;
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   139
    long double flo = std::modf (v, &fhi);
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   140
    // Add 0.5 to round, which improves the last count
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   141
    // This breaks these tests:
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   142
    //   TestSuite devices-mesh-dot11s-regression
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   143
    //   TestSuite devices-mesh-flame-regression
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   144
    //   TestSuite routing-aodv-regression
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   145
    //   TestSuite routing-olsr-regression
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   146
    // Setting round = 0; breaks:
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   147
    //   TestSuite int64x64
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   148
    const long double round = 0.5;
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   149
    flo = flo * HP_MAX_64 + round;
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   150
    int64_t  hi = fhi;
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   151
    uint64_t lo = flo;
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   152
    if (flo >= HP_MAX_64)
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   153
      {
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   154
	// conversion to uint64 rolled over
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   155
	++hi;
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   156
      }
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   157
    if (negative)
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   158
      {
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   159
	lo = ~lo;
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   160
	hi = ~hi;
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   161
	if (++lo == 0)
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   162
	  {
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   163
	    ++hi;
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   164
	  }
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   165
      }
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   166
    return std::make_pair (hi, lo);
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   167
    }
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   168
public:
10597
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   169
  /**
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   170
   * Get the integer portion.
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   171
   *
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   172
   * \return The integer portion of this value.
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   173
   */
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   174
  inline int64_t GetHigh (void) const
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   175
  {
10637
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   176
    return GetHighLow ().first;
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   177
  }
10637
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   178
private:
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   179
  /**
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   180
   * Get the high and low portions of this value.
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   181
   *
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   182
   * \return a pair of the high and low words
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   183
   */
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   184
  std::pair<int64_t, uint64_t> GetHighLow (void) const
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   185
    {
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   186
    const bool negative = _v < 0;
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   187
    const long double v = negative ? -_v : _v;
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   188
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   189
    long double fhi;
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   190
    long double flo = std::modf (v, &fhi);
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   191
    // Add 0.5 to round, which improves the last count
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   192
    // This breaks these tests:
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   193
    //   TestSuite devices-mesh-dot11s-regression
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   194
    //   TestSuite devices-mesh-flame-regression
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   195
    //   TestSuite routing-aodv-regression
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   196
    //   TestSuite routing-olsr-regression
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   197
    // Setting round = 0; breaks:
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   198
    //   TestSuite int64x64
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   199
    const long double round = 0.5;
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   200
    flo = flo * HP_MAX_64 + round;
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   201
    int64_t  hi = fhi;
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   202
    uint64_t lo = flo;
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   203
    if (flo >= HP_MAX_64)
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   204
      {
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   205
	// conversion to uint64 rolled over
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   206
	++hi;
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   207
      }
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   208
    if (negative)
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   209
      {
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   210
	lo = ~lo;
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   211
	hi = ~hi;
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   212
	if (++lo == 0)
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   213
	  {
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   214
	    ++hi;
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   215
	  }
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   216
      }
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   217
    return std::make_pair (hi, lo);
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   218
    }
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   219
public:
10597
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   220
  /**
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   221
   * Get the fractional portion of this value, unscaled.
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   222
   *
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   223
   * \return The fractional portion, unscaled, as an integer.
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   224
   */
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   225
  inline uint64_t GetLow (void) const
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   226
  {
10637
67601c471c22 [Bug 1856] int64x64_t double conversions
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10597
diff changeset
   227
    return GetHighLow ().second;
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   228
  }
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   229
10597
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   230
  /**
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   231
   * Multiply this value by a Q0.128 value, presumably representing an inverse,
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   232
   * completing a division operation.
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   233
   *
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   234
   * \param [in] o The inverse operand.
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   235
   *
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   236
   * \note There is no difference between Q64.64 and Q0.128 in this implementation,
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   237
   * so this function is a simple multiply.
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   238
   */
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   239
  inline void MulByInvert (const int64x64_t & o)
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   240
  {
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   241
    _v *= o._v;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   242
  }
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   243
10597
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   244
  /**
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   245
   * Compute the inverse of an integer value.
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   246
   *
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   247
   * \param [in] v The value to compute the inverse of.
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   248
   * \return The inverse.
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   249
   */
7039
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7032
diff changeset
   250
  static inline int64x64_t Invert (uint64_t v)
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   251
  {
10597
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   252
    int64x64_t tmp ((long double)1 / v);
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   253
    return tmp;
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   254
  }
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   255
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   256
private:
10597
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   257
  friend bool         operator == (const int64x64_t & lhs, const int64x64_t & rhs);
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   258
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   259
  friend bool         operator <  (const int64x64_t & lhs, const int64x64_t & rhs);
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   260
  friend bool         operator >  (const int64x64_t & lhs, const int64x64_t & rhs);
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   261
  
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   262
  friend int64x64_t & operator += (      int64x64_t & lhs, const int64x64_t & rhs);
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   263
  friend int64x64_t & operator -= (      int64x64_t & lhs, const int64x64_t & rhs);
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   264
  friend int64x64_t & operator *= (      int64x64_t & lhs, const int64x64_t & rhs);
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   265
  friend int64x64_t & operator /= (      int64x64_t & lhs, const int64x64_t & rhs);
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   266
10597
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   267
  friend int64x64_t   operator -  (const int64x64_t & lhs);
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   268
  friend int64x64_t   operator !  (const int64x64_t & lhs);
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   269
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   270
  long double _v;  //!< The Q64.64 value.
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   271
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   272
};  // class int64x64_t
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   273
10597
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   274
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   275
/**
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   276
 * \ingroup highprec
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   277
 * Equality operator.
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   278
 */
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   279
inline bool operator == (const int64x64_t & lhs, const int64x64_t & rhs)
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   280
{
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   281
  return lhs._v == rhs._v;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   282
}
10597
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   283
/**
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   284
 * \ingroup highprec
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   285
 * Less than operator
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   286
 */
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   287
inline bool operator < (const int64x64_t & lhs, const int64x64_t & rhs)
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   288
{
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   289
  return lhs._v < rhs._v;
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   290
}
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   291
/**
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   292
 * \ingroup highprec
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   293
 * Greater operator
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   294
 */
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   295
inline bool operator > (const int64x64_t & lhs, const int64x64_t & rhs)
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   296
{
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   297
  return lhs._v > rhs._v;
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   298
}
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   299
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   300
/**
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   301
 * \ingroup highprec
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   302
 * Compound addition operator
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   303
 */
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   304
inline int64x64_t & operator += (int64x64_t & lhs, const int64x64_t & rhs)
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   305
{
10597
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   306
  lhs._v += rhs._v;
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   307
  return lhs;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   308
}
10597
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   309
/**
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   310
 * \ingroup highprec
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   311
 * Compound subtraction operator
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   312
 */
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   313
inline int64x64_t & operator -= (int64x64_t & lhs, const int64x64_t & rhs)
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   314
{
10597
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   315
  lhs._v -= rhs._v;
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   316
  return lhs;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   317
}
10597
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   318
/**
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   319
 * \ingroup highprec
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   320
 * Compound multiplication operator
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   321
 */
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   322
inline int64x64_t & operator *= (int64x64_t & lhs, const int64x64_t & rhs)
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   323
{
10597
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   324
  lhs._v *= rhs._v;
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   325
  return lhs;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   326
}
10597
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   327
/**
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   328
 * \ingroup highprec
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   329
 * Compound division operator
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   330
 */
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   331
inline int64x64_t & operator /= (int64x64_t & lhs, const int64x64_t & rhs)
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   332
{
10597
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   333
  lhs._v /= rhs._v;
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   334
  return lhs;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   335
}
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   336
10597
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   337
/**
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   338
 * \ingroup highprec
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   339
 * Unary plus operator
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   340
 */
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   341
inline int64x64_t operator + (const int64x64_t & lhs)
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   342
{
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   343
  return lhs;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   344
}
10597
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   345
/**
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   346
 * \ingroup highprec
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   347
 * Unary negation operator (change sign operator)
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   348
 */
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   349
inline int64x64_t operator - (const int64x64_t & lhs)
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   350
{
7039
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7032
diff changeset
   351
  return int64x64_t (-lhs._v);
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   352
}
10597
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   353
/**
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   354
 * \ingroup highprec
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   355
 * Logical not operator
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   356
 */
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   357
inline int64x64_t operator ! (const int64x64_t & lhs)
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   358
{
7039
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7032
diff changeset
   359
  return int64x64_t (!lhs._v);
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   360
}
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   361
10597
6e1bd685bcaa [Bug 1786] Fix for os << (int64x64_t) and fractional arithmetic
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9894
diff changeset
   362
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   363
} // namespace ns3
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   364
7039
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7032
diff changeset
   365
#endif /* INT64X64_DOUBLE_H */