From ff76b2ab5126636ad509e6ba1e01ccc67b773467 Mon Sep 17 00:00:00 2001
From: Markus Blatt <mblatt@dune-project.org>
Date: Thu, 19 Nov 2009 10:22:25 +0000
Subject: [PATCH] Added conversion to double

[[Imported from SVN: r5714]]
---
 dune/common/bigunsignedint.hh          | 23 ++++++++++++++++++++-
 dune/common/test/bigunsignedinttest.cc | 28 ++++++--------------------
 2 files changed, 28 insertions(+), 23 deletions(-)

diff --git a/dune/common/bigunsignedint.hh b/dune/common/bigunsignedint.hh
index 845d88c12..53ba0e60f 100644
--- a/dune/common/bigunsignedint.hh
+++ b/dune/common/bigunsignedint.hh
@@ -124,6 +124,7 @@ namespace Dune
     //! export to other types
     //	operator unsigned int () const;
     unsigned int touint() const;
+    double todouble() const;
 
     friend class bigunsignedint<k/2>;
     friend class std::numeric_limits<bigunsignedint<k> >;
@@ -141,7 +142,9 @@ namespace Dune
   // Constructors
   template<int k>
   bigunsignedint<k>::bigunsignedint ()
-  {  }
+  {
+    assign(0u);
+  }
 
   template<int k>
   bigunsignedint<k>::bigunsignedint (int y)
@@ -175,6 +178,24 @@ namespace Dune
     return (digit[1]<<bits)+digit[0];
   }
 
+  template<int k>
+  inline double bigunsignedint<k>::todouble() const
+  {
+    int firstInZeroRange=n;
+    for(int i=n-1; i>=0; --i)
+      if(digit[i]!=0)
+        break;
+      else
+        --firstInZeroRange;
+    int representableDigits=std::numeric_limits<double>::digits/bits;
+    int lastInRepresentableRange=0;
+    if(representableDigits<firstInZeroRange)
+      lastInRepresentableRange=firstInZeroRange-representableDigits;
+    double val=0;
+    for(int i=firstInZeroRange-1; i>=lastInRepresentableRange; --i)
+      val =val*(1<<bits)+digit[i];
+    return val*(1<<(bits*lastInRepresentableRange));
+  }
   // print
   template<int k>
   inline void bigunsignedint<k>::print (std::ostream& s) const
diff --git a/dune/common/test/bigunsignedinttest.cc b/dune/common/test/bigunsignedinttest.cc
index 2586185cb..80e3451d4 100644
--- a/dune/common/test/bigunsignedinttest.cc
+++ b/dune/common/test/bigunsignedinttest.cc
@@ -47,25 +47,8 @@ int main()
 
   Dune::bigunsignedint<100> a, b, c;
   a=100;
-  int ret=0;
-  if(a.touint()!=100)
-  {
-    std::cerr<<"wrong conversion"<<std::endl;
-    ++ret;
-  }
-
   b=3;
-  if(b.touint()!=3)
-  {
-    std::cerr<<"wrong conversion"<<std::endl;
-    ++ret;
-  }
   c=a/b;
-  if(c.touint()!=100/3)
-  {
-    std::cerr<<"wrong conversion"<<std::endl;
-    ++ret;
-  }
   std::cout<<a<<"/"<<b<<"="<<c<<std::endl;
 
   try{
@@ -74,13 +57,14 @@ int main()
     b=0;
     c=a/1;
     std::cout<<a1<<"/"<<b1<<"="<<c1<<std::endl;
-    return ret;
-
+    a=1000000;
+    std::cout<<a.todouble()<<std::endl;
+    std::cout<<a.touint()<<std::endl;
+    b=a;
+    a=a*b*b;
+    std::cout<<a.todouble()<<std::endl;
   }
   catch(Dune::MathError e) {
     std::cout<<e<<std::endl;
-    return 1;
   }
-
-
 }
-- 
GitLab