src/simulator/high-precision-128.h
author Faker Moatamri <faker.moatamri@sophia.inria.fr>
Thu, 23 Apr 2009 09:35:16 +0200
changeset 4396 7d096e399d77
parent 1696 0de65f4c8c43
child 4397 fd344e3bceac
permissions -rw-r--r--
bug 533: Multiplication of Scalar variables does not give expected result
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
#ifndef HIGH_PRECISION_128_H
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    21
#define HIGH_PRECISION_128_H
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    22
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    23
#include <stdint.h>
170
9f68cb694f40 implement 128 bit arithmetic with cairo's internal types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 168
diff changeset
    24
#include "cairo-wideint-private.h"
168
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    25
216
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    26
/**
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    27
 * This file contains an implementation of the HighPrecision class.
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    28
 * Each instance of the Time class also contains an instance of this
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    29
 * class which is used to perform all the arithmetic operations of
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    30
 * the Time class.
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    31
 *
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    32
 * This code is a bit ugly with a lot of inline methods for speed:
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    33
 * profiling this code on anything but the simplest scenarios shows
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    34
 * that it is a big bottleneck if great care in its implementation
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    35
 * is not performed. My observations are that what dominates are 
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    36
 * Division operations (there are really really super costly)
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    37
 * and Comparison operations (because there are typically a lot of
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    38
 * these in any complex timekeeping code).
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    39
 *
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    40
 * So, the code tries really hard to perform any of these 128 bit 
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    41
 * operations by doing all arithmetic on 64 bit integers when possible
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    42
 * (i.e., when there is no fractional part. This is a very common case).
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    43
 * Hence, the following code has a m_fastValue (64 bits) and a 
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    44
 * m_slowValue (128 bits). m_fastValue is used by default and the code
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    45
 * converts it to a m_slowValue when needed.
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    46
 *
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    47
 * If you want to monitor the efficiency of this strategy, you can 
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    48
 * enable the macro HP128INC below and call the HighPrecision::PrintStats
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    49
 * method at the end of the simulation.
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    50
 */
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    51
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    52
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: 216
diff changeset
    53
#define noGATHER_STATISTICS 1
18482543e248 improve debugger output for time variables when we do not need the 128 bit statistics
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 216
diff changeset
    54
18482543e248 improve debugger output for time variables when we do not need the 128 bit statistics
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 216
diff changeset
    55
#ifdef GATHER_STATISTICS
18482543e248 improve debugger output for time variables when we do not need the 128 bit statistics
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 216
diff changeset
    56
#define HP128INC(x) x++
18482543e248 improve debugger output for time variables when we do not need the 128 bit statistics
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 216
diff changeset
    57
#else
214
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    58
#define HP128INC(x)
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: 216
diff changeset
    59
#endif
214
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    60
168
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    61
namespace ns3 {
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    62
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    63
class HighPrecision 
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    64
{
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    65
public:
214
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    66
  inline HighPrecision ();
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    67
  inline HighPrecision (int64_t value, bool dummy);
168
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    68
  HighPrecision (double value);
214
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    69
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    70
  static void PrintStats (void);
168
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    71
  
214
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    72
  inline int64_t GetInteger (void) const;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    73
  inline double GetDouble (void) const;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    74
  inline bool Add (HighPrecision const &o);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    75
  inline bool Sub (HighPrecision const &o);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    76
  inline bool Mul (HighPrecision const &o);
168
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    77
  bool Div (HighPrecision const &o);
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    78
214
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    79
  inline int Compare (HighPrecision const &o) const;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    80
  inline static HighPrecision Zero (void);
168
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    81
private:
214
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    82
  int64_t SlowGetInteger (void) const;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    83
  double SlowGetDouble (void) const;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    84
  bool SlowAdd (HighPrecision const &o);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    85
  bool SlowSub (HighPrecision const &o);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    86
  bool SlowMul (HighPrecision const &o);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    87
  int SlowCompare (HighPrecision const &o) const;
4396
7d096e399d77 bug 533: Multiplication of Scalar variables does not give expected result
Faker Moatamri <faker.moatamri@sophia.inria.fr>
parents: 1696
diff changeset
    88
  cairo_uint128_t  Mul128(cairo_uint128_t , cairo_uint128_t );
214
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    89
  inline void EnsureSlow (void);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    90
170
9f68cb694f40 implement 128 bit arithmetic with cairo's internal types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 168
diff changeset
    91
  static const double MAX_64;
214
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    92
  bool m_isFast;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    93
  int64_t m_fastValue;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    94
  cairo_int128_t m_slowValue;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    95
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: 216
diff changeset
    96
#ifdef GATHER_STATISTICS
214
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    97
  static int m_nfastadds;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    98
  static int m_nfastsubs;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    99
  static int m_nfastmuls;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   100
  static int m_nfastcmps;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   101
  static int m_nfastgets;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   102
  static int m_nslowadds;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   103
  static int m_nslowsubs;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   104
  static int m_nslowmuls;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   105
  static int m_nslowcmps;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   106
  static int m_nslowgets;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   107
  static int m_ndivs;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   108
  static int m_nconversions;
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: 216
diff changeset
   109
#endif /* GATHER_STATISTICS */
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
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   112
}; // namespace ns3
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: 170
diff changeset
   114
namespace ns3 {
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   115
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   116
HighPrecision::HighPrecision ()
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   117
  : m_isFast (true),
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   118
    m_fastValue (0)
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   119
{}
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   120
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   121
HighPrecision::HighPrecision (int64_t value, bool dummy)
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   122
  : m_isFast (true),
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   123
    m_fastValue (value)
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   124
{}
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   125
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   126
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   127
int64_t 
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   128
HighPrecision::GetInteger (void) const
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   129
{
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   130
  if (m_isFast)
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   131
    {
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   132
      HP128INC (m_nfastgets);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   133
      return m_fastValue;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   134
    }
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   135
  else
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   136
    {
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   137
      HP128INC (m_nslowgets);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   138
      return SlowGetInteger ();
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   139
    }
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   140
}
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   141
double HighPrecision::GetDouble (void) const
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   142
{
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   143
  if (m_isFast)
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   144
    {
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   145
      HP128INC (m_nfastgets);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   146
      double retval = m_fastValue;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   147
      return retval;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   148
    }
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   149
  else
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   150
    {
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   151
      HP128INC (m_nslowgets);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   152
      return SlowGetDouble ();
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   153
    }
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   154
}
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   155
bool 
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   156
HighPrecision::Add (HighPrecision const &o)
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   157
{
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   158
  if (m_isFast && o.m_isFast)
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   159
    {
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   160
      HP128INC (m_nfastadds);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   161
      m_fastValue += o.m_fastValue;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   162
      return false;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   163
    }
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   164
  else
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   165
    {
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   166
      HP128INC (m_nslowadds);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   167
      return SlowAdd (o);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   168
    }
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   169
}
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   170
bool 
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   171
HighPrecision::Sub (HighPrecision const &o)
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   172
{
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   173
  if (m_isFast && o.m_isFast)
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   174
    {
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   175
      HP128INC (m_nfastsubs);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   176
      m_fastValue -= o.m_fastValue;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   177
      return false;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   178
    }
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   179
  else
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   180
    {
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   181
      HP128INC (m_nslowsubs);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   182
      return SlowSub (o);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   183
    }
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   184
}
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   185
bool 
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   186
HighPrecision::Mul (HighPrecision const &o)
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   187
{
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   188
  if (m_isFast && o.m_isFast)
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   189
    {
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   190
      HP128INC (m_nfastmuls);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   191
      m_fastValue *= o.m_fastValue;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   192
      return false;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   193
    }
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   194
  else
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   195
    {
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   196
      HP128INC (m_nslowmuls);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   197
      return SlowMul (o);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   198
    }
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   199
}
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   200
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   201
int 
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   202
HighPrecision::Compare (HighPrecision const &o) const
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   203
{
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   204
  if (m_isFast && o.m_isFast)
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   205
    {
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   206
      HP128INC (m_nfastcmps);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   207
      if (m_fastValue < o.m_fastValue)
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   208
        {
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   209
          return -1;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   210
        }
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   211
      else if (m_fastValue == o.m_fastValue)
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   212
        {
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   213
          return 0;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   214
        }
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   215
      else
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   216
        {
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   217
          return +1;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   218
        }
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   219
    }
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   220
  else
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   221
    {
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   222
      HP128INC (m_nslowcmps);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   223
      return SlowCompare (o);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   224
    }
1212
02d60ab49490 add unreachable statement to solve gcc-4.0.x compiler bug for optimized builds on os x
Tom Henderson <tomh@tomh.org>
parents: 477
diff changeset
   225
  // The below statement is unreachable but necessary for optimized
02d60ab49490 add unreachable statement to solve gcc-4.0.x compiler bug for optimized builds on os x
Tom Henderson <tomh@tomh.org>
parents: 477
diff changeset
   226
  // builds with gcc-4.0.x due to a compiler bug.
02d60ab49490 add unreachable statement to solve gcc-4.0.x compiler bug for optimized builds on os x
Tom Henderson <tomh@tomh.org>
parents: 477
diff changeset
   227
  return 0;  
214
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   228
}
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   229
HighPrecision 
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   230
HighPrecision::Zero (void)
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   231
{
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   232
  return HighPrecision ();
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   233
}
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   234
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   235
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   236
}; // namespace ns3
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   237
168
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   238
#endif /* HIGH_PRECISION_128_H */