src/simulator/high-precision-128.cc
author Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
Tue, 06 Nov 2007 16:16:18 +0100
changeset 2084 24cfc21bda99
parent 1696 0de65f4c8c43
child 4046 607136a642c3
permissions -rw-r--r--
use the holland set of modes.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
168
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     1
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     2
/*
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     3
 * Copyright (c) 2006 INRIA
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     4
 *
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     5
 * This program is free software; you can redistribute it and/or modify
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     6
 * it under the terms of the GNU General Public License version 2 as
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     7
 * published by the Free Software Foundation;
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     8
 *
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     9
 * This program is distributed in the hope that it will be useful,
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    12
 * GNU General Public License for more details.
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    13
 *
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    14
 * You should have received a copy of the GNU General Public License
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    15
 * along with this program; if not, write to the Free Software
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    16
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    17
 *
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    18
 * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    19
 */
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    20
#include "high-precision-128.h"
170
9f68cb694f40 implement 128 bit arithmetic with cairo's internal types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 168
diff changeset
    21
#include <math.h>
214
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    22
#include <iostream>
168
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    23
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    24
namespace ns3 {
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    25
477
18482543e248 improve debugger output for time variables when we do not need the 128 bit statistics
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    26
#ifdef GATHER_STATISTICS
214
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    27
int HighPrecision::m_nfastadds = 0;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    28
int HighPrecision::m_nfastsubs = 0;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    29
int HighPrecision::m_nfastmuls = 0;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    30
int HighPrecision::m_nfastcmps = 0;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    31
int HighPrecision::m_nfastgets = 0;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    32
int HighPrecision::m_nslowadds = 0;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    33
int HighPrecision::m_nslowsubs = 0;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    34
int HighPrecision::m_nslowmuls = 0;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    35
int HighPrecision::m_nslowcmps = 0;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    36
int HighPrecision::m_nslowgets = 0;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    37
int HighPrecision::m_ndivs = 0;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    38
int HighPrecision::m_nconversions = 0;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    39
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    40
void 
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    41
HighPrecision::PrintStats (void)
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    42
{
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    43
  double nadds = m_nfastadds + m_nslowadds;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    44
  double nsubs = m_nfastsubs + m_nslowsubs;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    45
  double ncmps = m_nfastcmps + m_nslowcmps;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    46
  double nmuls = m_nfastmuls + m_nslowmuls;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    47
  double ngets = m_nfastgets + m_nslowgets;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    48
  double fast_add_ratio = m_nfastadds / nadds;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    49
  double fast_sub_ratio = m_nfastsubs / nsubs;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    50
  double fast_cmp_ratio = m_nfastcmps / ncmps;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    51
  double fast_mul_ratio = m_nfastmuls / nmuls;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    52
  double fast_get_ratio = m_nfastgets / ngets;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    53
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    54
  std::cout <<
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    55
    "add="<<fast_add_ratio<<std::endl<<
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    56
    "sub="<<fast_sub_ratio<<std::endl<<
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    57
    "cmp="<<fast_cmp_ratio<<std::endl<<
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    58
    "mul="<<fast_mul_ratio<<std::endl<<
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    59
    "get="<<fast_get_ratio<<std::endl<<
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    60
    "nadds="<<nadds<<std::endl<<
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    61
    "nsubs="<<nsubs<<std::endl<<
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    62
    "ncmps="<<ncmps<<std::endl<<
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    63
    "nmuls="<<nmuls<<std::endl<<
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    64
    "ngets="<<ngets<<std::endl<<
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    65
    "ndivs="<<m_ndivs<<std::endl<<
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    66
    "nconversions="<<m_nconversions<<std::endl
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    67
    ;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    68
}
477
18482543e248 improve debugger output for time variables when we do not need the 128 bit statistics
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    69
#else
18482543e248 improve debugger output for time variables when we do not need the 128 bit statistics
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    70
void 
18482543e248 improve debugger output for time variables when we do not need the 128 bit statistics
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    71
HighPrecision::PrintStats (void)
18482543e248 improve debugger output for time variables when we do not need the 128 bit statistics
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    72
{}
18482543e248 improve debugger output for time variables when we do not need the 128 bit statistics
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    73
#endif /* GATHER_STATISTICS */
214
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    74
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    75
170
9f68cb694f40 implement 128 bit arithmetic with cairo's internal types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 168
diff changeset
    76
const double HighPrecision::MAX_64 = 18446744073709551615.0;
168
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    77
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    78
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    79
HighPrecision::HighPrecision (double value)
170
9f68cb694f40 implement 128 bit arithmetic with cairo's internal types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 168
diff changeset
    80
{
9f68cb694f40 implement 128 bit arithmetic with cairo's internal types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 168
diff changeset
    81
  int64_t hi = (int64_t) floor (value);
9f68cb694f40 implement 128 bit arithmetic with cairo's internal types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 168
diff changeset
    82
  uint64_t lo = (uint64_t) ((value - floor (value)) * MAX_64);
214
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    83
  if (lo == 0)
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    84
    {
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    85
      m_isFast = true;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    86
      m_fastValue = hi;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    87
      return;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    88
    }
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    89
  else
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    90
    {
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    91
      m_isFast = false;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    92
      m_slowValue = _cairo_int64_to_int128 (hi);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    93
      m_slowValue = _cairo_int128_lsl (m_slowValue, 64);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    94
      cairo_int128_t clo = _cairo_uint128_to_int128 (_cairo_uint64_to_uint128 (lo));
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    95
      m_slowValue = _cairo_int128_add (m_slowValue, clo);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    96
    }
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    97
}
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    98
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
    99
void
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
   100
HighPrecision::EnsureSlow (void)
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
   101
{
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
   102
  if (m_isFast)
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
   103
    {
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
   104
      HP128INC (m_nconversions++);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
   105
      m_slowValue = _cairo_int64_to_int128 (m_fastValue);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
   106
      m_slowValue = _cairo_int128_lsl (m_slowValue, 64);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
   107
      m_isFast = false;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
   108
    }
170
9f68cb694f40 implement 128 bit arithmetic with cairo's internal types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 168
diff changeset
   109
}
168
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   110
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   111
int64_t
214
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
   112
HighPrecision::SlowGetInteger (void) const
168
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   113
{
214
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
   114
  cairo_int128_t value = _cairo_int128_rsa (m_slowValue, 64);
170
9f68cb694f40 implement 128 bit arithmetic with cairo's internal types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 168
diff changeset
   115
  return _cairo_int128_to_int64 (value);
168
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   116
}
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   117
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   118
double 
214
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
   119
HighPrecision::SlowGetDouble (void) const
168
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   120
{
214
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
   121
  bool is_negative = _cairo_int128_negative (m_slowValue);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
   122
  cairo_int128_t value = is_negative?_cairo_int128_negate (m_slowValue):m_slowValue;
174
ee8209d8a84e fix 128 bit to/from double conversions
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 172
diff changeset
   123
  cairo_int128_t hi = _cairo_int128_rsa (value, 64);
ee8209d8a84e fix 128 bit to/from double conversions
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 172
diff changeset
   124
  cairo_uint128_t lo = _cairo_int128_sub (value, _cairo_uint128_lsl (hi, 64));
ee8209d8a84e fix 128 bit to/from double conversions
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 172
diff changeset
   125
  double flo = _cairo_uint128_to_uint64 (lo);
ee8209d8a84e fix 128 bit to/from double conversions
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 172
diff changeset
   126
  flo /= MAX_64;
ee8209d8a84e fix 128 bit to/from double conversions
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 172
diff changeset
   127
  double retval = _cairo_uint128_to_uint64 (hi);
ee8209d8a84e fix 128 bit to/from double conversions
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 172
diff changeset
   128
  retval += flo;
ee8209d8a84e fix 128 bit to/from double conversions
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 172
diff changeset
   129
  retval *= is_negative?-1.0:1.0;
170
9f68cb694f40 implement 128 bit arithmetic with cairo's internal types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 168
diff changeset
   130
  return retval;
168
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   131
}
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   132
bool 
214
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
   133
HighPrecision::SlowAdd (HighPrecision const &o)
168
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   134
{
214
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
   135
  EnsureSlow ();
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
   136
  const_cast<HighPrecision &> (o).EnsureSlow ();
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
   137
  m_slowValue = _cairo_int128_add (m_slowValue, o.m_slowValue);
168
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   138
  return false;
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   139
}
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   140
bool 
214
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
   141
HighPrecision::SlowSub (HighPrecision const &o)
168
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   142
{
214
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
   143
  EnsureSlow ();
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
   144
  const_cast<HighPrecision &> (o).EnsureSlow ();
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
   145
  m_slowValue = _cairo_int128_sub (m_slowValue, o.m_slowValue);
168
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   146
  return false;
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   147
}
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   148
bool 
214
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
   149
HighPrecision::SlowMul (HighPrecision const &o)
168
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   150
{
214
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
   151
  EnsureSlow ();
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
   152
  const_cast<HighPrecision &> (o).EnsureSlow ();
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
   153
  cairo_int128_t other = _cairo_int128_rsa (o.m_slowValue, 64);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
   154
  m_slowValue = _cairo_int128_mul (m_slowValue, other);
168
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   155
  return false;
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   156
}
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   157
bool 
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   158
HighPrecision::Div (HighPrecision const &o)
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   159
{
214
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
   160
  HP128INC (m_ndivs++);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
   161
  EnsureSlow ();
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
   162
  const_cast<HighPrecision &> (o).EnsureSlow ();
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
   163
  cairo_int128_t div = _cairo_int128_rsa (o.m_slowValue, 64);
170
9f68cb694f40 implement 128 bit arithmetic with cairo's internal types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 168
diff changeset
   164
  cairo_quorem128_t qr;
214
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
   165
  qr = _cairo_int128_divrem (m_slowValue, div);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
   166
  m_slowValue = qr.quo;
168
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   167
  return false;
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   168
}
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   169
int 
214
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
   170
HighPrecision::SlowCompare (HighPrecision const &o) const
168
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   171
{
214
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
   172
  const_cast<HighPrecision *> (this)->EnsureSlow ();
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
   173
  const_cast<HighPrecision &> (o).EnsureSlow ();
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
   174
  if (_cairo_int128_lt (m_slowValue, o.m_slowValue))
170
9f68cb694f40 implement 128 bit arithmetic with cairo's internal types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 168
diff changeset
   175
    {
9f68cb694f40 implement 128 bit arithmetic with cairo's internal types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 168
diff changeset
   176
      return -1;
9f68cb694f40 implement 128 bit arithmetic with cairo's internal types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 168
diff changeset
   177
    }
214
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
   178
  else if (_cairo_int128_eq (m_slowValue, o.m_slowValue))
170
9f68cb694f40 implement 128 bit arithmetic with cairo's internal types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 168
diff changeset
   179
    {
9f68cb694f40 implement 128 bit arithmetic with cairo's internal types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 168
diff changeset
   180
      return 0;
9f68cb694f40 implement 128 bit arithmetic with cairo's internal types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 168
diff changeset
   181
    }
9f68cb694f40 implement 128 bit arithmetic with cairo's internal types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 168
diff changeset
   182
  else
9f68cb694f40 implement 128 bit arithmetic with cairo's internal types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 168
diff changeset
   183
    {
9f68cb694f40 implement 128 bit arithmetic with cairo's internal types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 168
diff changeset
   184
      return 1;
9f68cb694f40 implement 128 bit arithmetic with cairo's internal types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 168
diff changeset
   185
    }
168
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   186
}
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   187
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   188
}; // namespace ns3
177
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   189
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   190
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   191
#ifdef RUN_SELF_TESTS
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   192
#include "ns3/test.h"
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   193
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   194
namespace ns3 {
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   195
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   196
class HighPrecision128Tests : public Test
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   197
{
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   198
public:
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   199
  HighPrecision128Tests ();
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   200
  virtual ~HighPrecision128Tests ();
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   201
  virtual bool RunTests (void);
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   202
};
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   203
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   204
HighPrecision128Tests::HighPrecision128Tests ()
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   205
  : Test ("Int128")
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   206
{}
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   207
HighPrecision128Tests::~HighPrecision128Tests ()
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   208
{}
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   209
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   210
#define CHECK_EXPECTED(v,expected) \
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   211
{ \
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   212
  if (v.GetInteger () != expected) \
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   213
    { \
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   214
      Failure () << "file="<<__FILE__<<", line="<<__LINE__<<", expected: "<<expected<<", got: "<< v.GetInteger ()<<std::endl; \
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   215
      ok = false; \
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   216
    } \
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   217
}
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   218
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   219
#define V(v) \
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   220
  HighPrecision (v, false)
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   221
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   222
bool
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   223
HighPrecision128Tests::RunTests (void)
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   224
{
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   225
  bool ok = true;
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   226
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   227
  HighPrecision a, b;
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   228
  a = HighPrecision (1, false);
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   229
  b = HighPrecision (1, false);
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   230
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   231
  a.Sub (b);
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   232
  CHECK_EXPECTED (a, 0);
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   233
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   234
  a = V (1);
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   235
  a.Sub (V(2));
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   236
  CHECK_EXPECTED (a, -1);
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   237
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   238
  a = V (1);
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   239
  a.Sub (V(3));
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   240
  CHECK_EXPECTED (a, -2);
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   241
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   242
  a = V (1);
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   243
  a.Sub (V(-1));
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   244
  CHECK_EXPECTED (a, 2);
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   245
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   246
  a = V (1);
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   247
  a.Sub (V(-2));
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   248
  CHECK_EXPECTED (a, 3);
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   249
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   250
  a = V (-3);
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   251
  a.Sub (V(-4));
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   252
  CHECK_EXPECTED (a, 1);
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   253
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   254
  a = V (-2);
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   255
  a.Sub (V(3));
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   256
  CHECK_EXPECTED (a, -5);
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   257
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   258
  a = V (1);
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   259
  a.Add (V(2));
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   260
  CHECK_EXPECTED (a, 3);
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   261
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   262
  a = V (1);
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   263
  a.Add (V(-3));
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   264
  CHECK_EXPECTED (a, -2);
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   265
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   266
  a = V (0);
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   267
  a.Add (V(0));
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   268
  CHECK_EXPECTED (a, 0);
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   269
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   270
  a = V (0);
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   271
  a.Mul (V(0));
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   272
  CHECK_EXPECTED (a, 0);
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   273
  a = V (0);
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   274
  a.Mul (V(1));
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   275
  CHECK_EXPECTED (a, 0);
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   276
  a = V (0);
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   277
  a.Mul (V(-1));
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   278
  CHECK_EXPECTED (a, 0);
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   279
  a = V (1);
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   280
  a.Mul (V(0));
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   281
  CHECK_EXPECTED (a, 0);
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   282
  a = V (1);
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   283
  a.Mul (V(1));
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   284
  CHECK_EXPECTED (a, 1);
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   285
  a = V (1);
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   286
  a.Mul (V(-1));
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   287
  CHECK_EXPECTED (a, -1);
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   288
  a = V (-1);
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   289
  a.Mul (V(-1));
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   290
  CHECK_EXPECTED (a, 1);
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   291
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   292
  a = V (0);
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   293
  a.Mul (V(1));
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   294
  CHECK_EXPECTED (a, 0);
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   295
  a = V (0);
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   296
  a.Mul (V(-1));
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   297
  CHECK_EXPECTED (a, 0);
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   298
  a = V (1);
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   299
  a.Mul (V(1));
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   300
  CHECK_EXPECTED (a, 1);
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   301
  a = V (1);
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   302
  a.Mul (V(-1));
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   303
  CHECK_EXPECTED (a, -1);
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   304
  a = V (-1);
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   305
  a.Mul (V(1));
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   306
  CHECK_EXPECTED (a, -1);
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   307
  a = V (-1);
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   308
  a.Mul (V(-1));
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   309
  CHECK_EXPECTED (a, 1);
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   310
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   311
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   312
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   313
  a = V (2);
178
78e2db8d8128 even more tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 177
diff changeset
   314
  a.Mul (V(3));
78e2db8d8128 even more tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 177
diff changeset
   315
  a.Div (V(3));
78e2db8d8128 even more tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 177
diff changeset
   316
  CHECK_EXPECTED (a, 2);
78e2db8d8128 even more tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 177
diff changeset
   317
78e2db8d8128 even more tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 177
diff changeset
   318
  // Below, the division loses precision because 2/3 is not
78e2db8d8128 even more tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 177
diff changeset
   319
  // representable exactly in 64.64 integers. So, we got
78e2db8d8128 even more tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 177
diff changeset
   320
  // something super close but the final rounding kills us.
78e2db8d8128 even more tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 177
diff changeset
   321
  a = V (2);
177
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   322
  a.Div (V(3));
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   323
  a.Mul (V(3));
178
78e2db8d8128 even more tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 177
diff changeset
   324
  CHECK_EXPECTED (a, 1);
78e2db8d8128 even more tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 177
diff changeset
   325
78e2db8d8128 even more tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 177
diff changeset
   326
  // The example below shows that we really do not lose
78e2db8d8128 even more tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 177
diff changeset
   327
  // much precision internally: it is almost always the
78e2db8d8128 even more tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 177
diff changeset
   328
  // final conversion which loses precision.
78e2db8d8128 even more tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 177
diff changeset
   329
  a = V (2000000000);
78e2db8d8128 even more tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 177
diff changeset
   330
  a.Div (V(3));
78e2db8d8128 even more tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 177
diff changeset
   331
  a.Mul (V(3));
78e2db8d8128 even more tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 177
diff changeset
   332
  CHECK_EXPECTED (a, 1999999999);
78e2db8d8128 even more tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 177
diff changeset
   333
  
177
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   334
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   335
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   336
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   337
  return ok;
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   338
}
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   339
214
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 178
diff changeset
   340
static HighPrecision128Tests g_int128Tests;
177
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   341
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   342
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   343
}; // namespace ns3
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   344
9ba1bf880c55 a bunch of tests
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 175
diff changeset
   345
#endif /* RUN_SELF_TESTS */