summaryrefslogtreecommitdiff
path: root/source/luametatex/source/tex/texarithmetic.h
diff options
context:
space:
mode:
authorHans Hagen <pragma@wxs.nl>2022-09-16 15:53:42 +0200
committerContext Git Mirror Bot <phg@phi-gamma.net>2022-09-16 15:53:42 +0200
commitc161b7d6fe142231346cc1844e6e27c0ab7718c1 (patch)
tree3fd877b8986137703e987e4651a2db8e946a0f72 /source/luametatex/source/tex/texarithmetic.h
parente94fa4dc30ec28a6727aa85e17aaac18b76aeadb (diff)
downloadcontext-c161b7d6fe142231346cc1844e6e27c0ab7718c1.tar.gz
2022-09-16 14:41:00
Diffstat (limited to 'source/luametatex/source/tex/texarithmetic.h')
-rw-r--r--source/luametatex/source/tex/texarithmetic.h42
1 files changed, 42 insertions, 0 deletions
diff --git a/source/luametatex/source/tex/texarithmetic.h b/source/luametatex/source/tex/texarithmetic.h
new file mode 100644
index 000000000..53deca36b
--- /dev/null
+++ b/source/luametatex/source/tex/texarithmetic.h
@@ -0,0 +1,42 @@
+/*
+ See license.txt in the root of this project.
+*/
+
+# ifndef LMT_ARITHMETIC_H
+# define LMT_ARITHMETIC_H
+
+/*tex
+
+ Fixed-point arithmetic is done on {\em scaled integers} that are multiples of $2^{-16}$. In
+ other words, a binary point is assumed to be sixteen bit positions from the right end of a
+ binary computer word.
+
+*/
+
+extern scaled tex_multiply_and_add (int n, scaled x, scaled y, scaled max_answer);
+extern scaled tex_nx_plus_y (int n, scaled x, scaled y);
+extern scaled tex_multiply_integers (int n, scaled x);
+extern scaled tex_x_over_n_r (scaled x, int n, int *remainder);
+extern scaled tex_x_over_n (scaled x, int n);
+extern scaled tex_xn_over_d (scaled x, int n, int d);
+extern scaled tex_xn_over_d_r (scaled x, int n, int d, int *remainder);
+/* scaled tex_divide_scaled (scaled s, scaled m, int dd); */
+extern scaled tex_divide_scaled_n (double s, double m, double d);
+extern scaled tex_ext_xn_over_d (scaled, scaled, scaled);
+extern scaled tex_round_xn_over_d (scaled x, int n, unsigned int d);
+
+inline static scaled tex_round_decimals_digits(const unsigned char *digits, unsigned k)
+{
+ int a = 0;
+ while (k-- > 0) {
+ a = (a + digits[k] * two) / 10;
+ }
+ return (a + 1) / 2;
+}
+
+inline static int tex_half_scaled(int x)
+{
+ return odd(x) ? ((x + 1) / 2) : (x / 2);
+}
+
+# endif