summaryrefslogtreecommitdiff
path: root/source/luametatex/source/utilities/auxarithmetic.h
diff options
context:
space:
mode:
Diffstat (limited to 'source/luametatex/source/utilities/auxarithmetic.h')
-rw-r--r--source/luametatex/source/utilities/auxarithmetic.h61
1 files changed, 61 insertions, 0 deletions
diff --git a/source/luametatex/source/utilities/auxarithmetic.h b/source/luametatex/source/utilities/auxarithmetic.h
new file mode 100644
index 000000000..8daf6f29a
--- /dev/null
+++ b/source/luametatex/source/utilities/auxarithmetic.h
@@ -0,0 +1,61 @@
+/*
+ See license.txt in the root of this project.
+*/
+
+# ifndef LMT_UTILITIES_ARITHMETIC_H
+# define LMT_UTILITIES_ARITHMETIC_H
+
+/* The |fabs| macro is used in mp. */
+
+/*tex
+
+There has always be much attention on accuracy in \TEX, especially in the perspective of portability.
+Keep in mind that \TEX\ was written when there was no IEEE floating point defined so all happens in
+16.16, or actually in 14.16 precission. We could actually consider going 16.16 if we use long integers
+in some places but it needs some checking first. We could just accept wrapping around as that already
+happens in some places anyway (not all dimension calculation are checked).
+
+In \LUATEX\ and \LUAMETATEX\ we have the \LUA\ engine and that one was exclusively using doubles till
+5.3 when it went for a more hybrid approach. Because we go a lot between \TEX\ and \LUA\ (in \CONTEXT)
+that had some consequences and rounding happens all over the place. It is also for that reason that
+we now use doubles and rounding in some more places in the \TEX\ part: it is more consistent with what
+happens at the \LUA\ end. And, because IEEE is common now, we are (afaiks) portable enough.
+
+We don't use round but lround as that one rounds away from zero. In a few places we use llround. Also
+in some places we clip to the official maxima but not always.
+
+*/
+
+
+/*
+# undef abs
+# undef fabs
+
+# define abs(x) ((int)(x) >= 0 ? (int)(x) : (int)-(x))
+# define fabs(x) ((x) >= 0.0 ? (x) : -(x))
+*/
+
+# define odd(x) ((x) & 1)
+
+# define lfloor(x) ( (lua_Integer)(floor((double)(x))) )
+# define tfloor(x) ( (size_t) (floor((double)(x))) )
+# define ifloor(x) ( (int) (floor((double)(x))) )
+
+//define lround(x) ( ((double) x >= 0.0) ? (lua_Integer) ((double) x + 0.5) : (lua_Integer) ((double) x - 0.5) )
+//define tround(x) ( ((double) x >= 0.0) ? (size_t) ((double) x + 0.5) : (size_t) ((double) x - 0.5) )
+//define iround(x) ( ((double) x >= 0.0) ? (int) ((double) x + 0.5) : (int) ((double) x - 0.5) )
+//define sround(x) ( ((double) x >= 0.0) ? (int) ((double) x + 0.5) : (int) ((double) x - 0.5) )
+
+//define lround(x) ( ((double) x >= 0.0) ? (lua_Integer) ((double) x + 0.5) : (lua_Integer) ((double) x - 0.5) )
+//define tround(x) ( ((double) x >= 0.0) ? (size_t) ((double) x + 0.5) : (size_t) ((double) x - 0.5) )
+//define iround(x) ( (int) lround((double) x) )
+
+//define zround(r) ((r>2147483647.0) ? 2147483647 : ((r<-2147483647.0) ? -2147483647 : ((r >= 0.0) ? (int)(r + 0.5) : ((int)(r-0.5)))))
+//define zround(r) ((r>2147483647.0) ? 2147483647 : ((r<-2147483647.0) ? -2147483647 : (int) lround(r)))
+
+# define scaledround(x) ((scaled) lround((double) x))
+# define longlonground llround
+# define clippedround(r) ((r>2147483647.0) ? 2147483647 : ((r<-2147483647.0) ? -2147483647 : (int) lround(r)))
+# define glueround(x) clippedround((double) (x))
+
+# endif