[gcalctool] Optimise Pi and Euler's number calculation



commit a16adf4f6ecae340195de1f080d6335dac43bc57
Author: Robert Ancell <robert ancell canonical com>
Date:   Fri Jan 28 15:33:42 2011 +1000

    Optimise Pi and Euler's number calculation

 src/mp-trigonometric.c |    9 ++++++++-
 src/mp.c               |   13 ++++++++++---
 2 files changed, 18 insertions(+), 4 deletions(-)
---
diff --git a/src/mp-trigonometric.c b/src/mp-trigonometric.c
index f4cc8bb..f3efc38 100644
--- a/src/mp-trigonometric.c
+++ b/src/mp-trigonometric.c
@@ -25,6 +25,9 @@
 #include "mp.h"
 #include "mp-private.h"
 
+static MPNumber pi;
+static gboolean have_pi = FALSE;
+
 static int
 mp_compare_mp_to_int(const MPNumber *x, int i)
 {
@@ -64,7 +67,11 @@ convert_to_radians(const MPNumber *x, MPAngleUnit unit, MPNumber *z)
 void
 mp_get_pi(MPNumber *z)
 {
-    mp_set_from_string("3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679", 10, z);
+    if (mp_is_zero(&pi)) {
+        mp_set_from_string("3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679", 10, &pi);
+        have_pi = TRUE;
+    }
+    mp_set_from_mp(&pi, z);
 }
 
 
diff --git a/src/mp.c b/src/mp.c
index 798b1b0..210dfb3 100644
--- a/src/mp.c
+++ b/src/mp.c
@@ -25,6 +25,9 @@
 #include "mp.h"
 #include "mp-private.h"
 
+static MPNumber eulers_number;
+static gboolean have_eulers_number = FALSE;
+
 // FIXME: Re-add overflow and underflow detection
 
 char *mp_error = NULL;
@@ -101,9 +104,13 @@ mp_ext(int i, int j, MPNumber *x)
 void
 mp_get_eulers(MPNumber *z)
 {
-    MPNumber t;
-    mp_set_from_integer(1, &t);
-    mp_epowy(&t, z);
+    if (!have_eulers_number) {
+        MPNumber t;
+        mp_set_from_integer(1, &t);
+        mp_epowy(&t, &eulers_number);
+        have_eulers_number = TRUE;
+    }
+    mp_set_from_mp(&eulers_number, z);
 }
 
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]