summaryrefslogtreecommitdiff
path: root/source/luametatex/source/tex/texarithmetic.h
diff options
context:
space:
mode:
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