aboutsummaryrefslogtreecommitdiff
path: root/sys/gio/fpfixd.x
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunkeler@gmail.com>2015-07-08 20:46:52 -0400
committerJoseph Hunkeler <jhunkeler@gmail.com>2015-07-08 20:46:52 -0400
commitfa080de7afc95aa1c19a6e6fc0e0708ced2eadc4 (patch)
treebdda434976bc09c864f2e4fa6f16ba1952b1e555 /sys/gio/fpfixd.x
downloadiraf-linux-fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4.tar.gz
Initial commit
Diffstat (limited to 'sys/gio/fpfixd.x')
-rw-r--r--sys/gio/fpfixd.x43
1 files changed, 43 insertions, 0 deletions
diff --git a/sys/gio/fpfixd.x b/sys/gio/fpfixd.x
new file mode 100644
index 00000000..64a2f544
--- /dev/null
+++ b/sys/gio/fpfixd.x
@@ -0,0 +1,43 @@
+# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
+
+include <mach.h>
+
+# FP_FIXD -- The following procedure is equivalent to "int(x)", except that
+# it preserves the most significant digits of x, when x is greater than the
+# largest integer. For example, if an integer is 32 bits and X has a 58 bit
+# mantissa, "int(x)" would cause nearly half the precision to be lost.
+#
+# Algorithm (x is assumed nonnegative):
+# (1) find high, low x such that x = highx + lowx
+# and highx contains the extra digits of precision.
+# (2) subtract highx from x, and truncate the residual by assignment
+# into a long integer.
+# (3) add truncated lowx and highx to get high precision truncated
+# double result.
+
+double procedure fp_fixd (x)
+
+double x
+double absx, highx, scaledx
+int expon
+long longx, lowx
+
+begin
+ absx = abs (x)
+ scaledx = absx
+ expon = 0
+
+ while (scaledx > MAX_LONG) {
+ scaledx = scaledx / 10.0D0
+ expon = expon + 1
+ }
+
+ longx = scaledx
+ highx = longx * (10.0D0 ** expon)
+ lowx = absx - highx
+
+ if (x > 0)
+ return (highx + lowx)
+ else
+ return (-highx - lowx)
+end