--- a/src/ov-mp.cc
+++ b/src/ov-mp.cc
@@ -27,10 +27,14 @@
 mpfr_prec_t octave_mp::prec = mpfr_get_default_prec ();
 
 octave_mp::octave_mp(void)
-  :octave_base_value(), rnd(mpfr_get_default_rounding_mode ())
-{
-  mpfr_init2 (scalar, prec);
-  mpfr_set_si (scalar, 0, rnd);
+  :octave_base_value() /*, rnd(mpfr_get_default_rounding_mode ()) */
+{
+  /* Bare minimum constructor -- avoid SEGV on exit */
+  (scalar)->_mpfr_d = 0;
+  /*
+    mpfr_init2 (scalar, prec);
+    mpfr_set_si (scalar, 0, rnd);
+  */
 }
 
 octave_mp::octave_mp (signed long si, mpfr_prec_t sprec,  mp_rnd_t srnd)
@@ -121,20 +125,27 @@
 
 /* proxy for equal_p, regular_p, ... */
 octave_value 
-octave_mp::oct_monocmp_proxy (const octave_mp& a1, 
+octave_mp::oct_monocmp_proxy (const octave_base_value& a1, 
                               int (*func) (mpfr_srcptr op1))
 {
-  return octave_value (func (a1.scalar));
+  const octave_mp *arg1 = reinterpret_cast<const octave_mp*>(&a1);
+  
+  return octave_value (func (arg1->scalar));
 }
 
 /* proxy for single-value transformations (mapping) */
 octave_value 
-octave_mp::oct_monop_proxy (const octave_mp& a1, 
+octave_mp::oct_monop_proxy (const octave_base_value& a1, 
                             int (*func) (mpfr_ptr rop, mpfr_srcptr op1, mpfr_rnd_t rnd))
 {
-  octave_mp* retval = new octave_mp(static_cast<long unsigned int> (0), mpfr_get_prec (a1.scalar), rnd); 
-  (void) func (retval->scalar, a1.scalar, rnd);
-  return octave_value (retval);  
+  const octave_mp *arg1 = reinterpret_cast<const octave_mp*>(&a1);
+  
+  octave_mp* retval = new octave_mp(static_cast<long unsigned int> (0), mpfr_get_prec (arg1->scalar), rnd); 
+  //mpfr_init2 (scalar,  mpfr_get_prec (a1.scalar));
+  (void) func (retval->scalar, arg1->scalar, rnd);
+  // (void) func (scalar, a1.scalar, rnd);
+  return octave_value (retval);
+  // return octave_value (this);    
 }
 
 /* proxy for two-values comparisons */
@@ -177,31 +188,49 @@
 {
   const octave_mp *arg1, *arg2; 
   octave_mp *retval;
-
+  
   if (octave_mp::static_type_id () == a1.type_id ())
     { /* a1 has the right type */
       arg1 = reinterpret_cast<const octave_mp*> (&a1);
+      mpfr_prec_t sprec1 = mpfr_get_prec (arg1->scalar);      
+      if (octave_mp::static_type_id() == a2.type_id())
+        {
+          arg2 = reinterpret_cast<const octave_mp*> (&a2);
+          mpfr_prec_t sprec2 = mpfr_get_prec (arg2->scalar);
+          if (sprec1 > sprec2)
+            {
+              retval = new octave_mp (static_cast<long unsigned int> (0), 
+                                      sprec1, arg1->rnd);
+              //  mpfr_init2 (scalar, sprec1);
+            }
+          else
+            {
+              retval = new octave_mp (static_cast<long unsigned int> (0), 
+                                      sprec2, arg1->rnd);
+              // mpfr_init2 (scalar, sprec1);
+            }        
+        }
+      else 
+        {
+          arg2 = new octave_mp (a2.double_value (), sprec1, arg1->rnd);
+          retval = new octave_mp (static_cast<long unsigned int> (0), 
+                                  sprec1, arg1->rnd);
+          // mpfr_init2 (scalar, sprec1);
+        }
+    }
+  else
+    {
+      arg2 = reinterpret_cast<const octave_mp*> (&a2);
+      mpfr_prec_t sprec2 = mpfr_get_prec (arg2->scalar);
+      arg1 = new octave_mp (a1.double_value (), sprec2, arg2->rnd);
       retval = new octave_mp (static_cast<long unsigned int> (0), 
-                             mpfr_get_prec (arg1->scalar), arg1->rnd);
-      
-      if (octave_mp::static_type_id() == a2.type_id())
-        {
-          arg2 = reinterpret_cast<const octave_mp*> (&a2);
-        } 
-      else 
-        {
-          arg2 = new octave_mp (a2.double_value (), mpfr_get_prec (arg1->scalar), 
-                                arg1->rnd);
-        }
-    }
-  else
-    {
-      arg2 = reinterpret_cast<const octave_mp*> (&a2);
-      arg1 = new octave_mp (a1.double_value (), mpfr_get_prec (arg2->scalar), 
-                            arg2->rnd);
+                              sprec2, arg1->rnd);
+      // mpfr_init2 (scalar, sprec2);
     }
   (void) func (retval->scalar, arg1->scalar, arg2->scalar, arg1->rnd);
+  // (void) func (scalar, arg1->scalar, arg2->scalar, arg1->rnd);
   return octave_value (retval);
+  // return octave_value (this);
 }
 
 octave_value