aboutsummaryrefslogtreecommitdiffstats
path: root/libj2_j2i_mul_j2i.3
diff options
context:
space:
mode:
Diffstat (limited to 'libj2_j2i_mul_j2i.3')
-rw-r--r--libj2_j2i_mul_j2i.3276
1 files changed, 276 insertions, 0 deletions
diff --git a/libj2_j2i_mul_j2i.3 b/libj2_j2i_mul_j2i.3
new file mode 100644
index 0000000..b0fb217
--- /dev/null
+++ b/libj2_j2i_mul_j2i.3
@@ -0,0 +1,276 @@
+.TH LIBJ2_J2I_MUL_J2I 3 LIBJ2
+.SH NAME
+libj2_j2i_mul_j2i \- Calculate product
+
+.SH SYNOPSIS
+.nf
+#include <libj2.h>
+
+enum libj2_overflow {
+ \fILIBJ2_NO_OVERFLOW\fP = 0,
+ \fILIBJ2_POSITIVE_OVERFLOW\fP = 1,
+ \fILIBJ2_POSITIVE_OVERFLOW_UNKNOWN\fP = 2,
+ \fILIBJ2_NEGATIVE_OVERFLOW\fP = -1,
+ \fILIBJ2_NEGATIVE_OVERFLOW_UNKNOWN\fP = -2
+};
+
+#define \fILIBJ2_OVERFLOW\fP LIBJ2_POSITIVE_OVERFLOW
+#define \fILIBJ2_OVERFLOW_UNKNOWN\fP LIBJ2_POSITIVE_OVERFLOW_UNKNOWN
+
+void \fBlibj2_j2i_mul_j2i\fP(struct libj2_j2i *\fIa\fP, const struct libj2_j2i *\fIb\fP);
+void \fBlibj2_j2i_mul_j2i_to_j2i\fP(const struct libj2_j2i *\fIa\fP, const struct libj2_j2i *\fIb\fP, struct libj2_j2i *\fIr\fP);
+void \fBlibj2_j2i_mul_ji\fP(struct libj2_j2i *\fIa\fP, intmax_t \fIb\fP);
+void \fBlibj2_j2i_mul_ji_to_j2i\fP(const struct libj2_j2i *\fIa\fP, intmax_t \fIb\fP, struct libj2_j2i *\fIr\fP);
+void \fBlibj2_ji_mul_j2i_to_j2i\fP(intmax_t \fIa\fP, const struct libj2_j2i *\fIb\fP, struct libj2_j2i *\fIr\fP);
+void \fBlibj2_ji_mul_ji_to_j2i\fP(intmax_t \fIa\fP, intmax_t \fIb\fP, struct libj2_j2i *\fIr\fP);
+
+int \fBlibj2_j2i_mul_j2i_overflow\fP(struct libj2_j2i *\fIa\fP, const struct libj2_j2i *\fIb\fP);
+int \fBlibj2_j2i_mul_j2i_to_j2i_overflow\fP(const struct libj2_j2i *\fIa\fP, const struct libj2_j2i *\fIb\fP, struct libj2_j2i *\fIr\fP);
+int \fBlibj2_j2i_mul_ji_overflow\fP(struct libj2_j2i *\fIa\fP, intmax_t \fIb\fP);
+int \fBlibj2_j2i_mul_ji_to_j2i_overflow\fP(const struct libj2_j2i *\fIa\fP, intmax_t \fIb\fP, struct libj2_j2i *\fIr\fP);
+int \fBlibj2_ji_mul_j2i_to_j2i_overflow\fP(intmax_t \fIa\fP, const struct libj2_j2i *\fIb\fP, struct libj2_j2i *\fIr\fP);
+
+int \fBlibj2_j2i_mul_j2i_overflow_p\fP(const struct libj2_j2i *\fIa\fP, const struct libj2_j2i *\fIb\fP);
+int \fBlibj2_j2i_mul_ji_overflow_p\fP(const struct libj2_j2i *\fIa\fP, intmax_t \fIb\fP);
+int \fBlibj2_ji_mul_j2i_overflow_p\fP(intmax_t \fIa\fP, const struct libj2_j2i *\fIb\fP);
+
+enum libj2_overflow \fBlibj2_j2i_mul_j2i_overflow_p_quick\fP(const struct libj2_j2i *\fIa\fP, const struct libj2_j2i *\fIb\fP);
+enum libj2_overflow \fBlibj2_j2i_mul_ji_overflow_p_quick\fP(const struct libj2_j2i *\fIa\fP, intmax_t \fIb\fP);
+enum libj2_overflow \fBlibj2_ji_mul_j2i_overflow_p_quick\fP(intmax_t \fIa\fP, const struct libj2_j2i *\fIb\fP);
+
+int \fBlibj2_j2i_mul_j2i_to_j2i_overflow_p\fP(const struct libj2_j2i *\fIa\fP, const struct libj2_j2i *\fIb\fP, struct libj2_j2i *\fIr\fP, int *\fIr_set\fP);
+int \fBlibj2_j2i_mul_ji_to_j2i_overflow_p\fP(const struct libj2_j2i *\fIa\fP, intmax_t \fIb\fP, struct libj2_j2i *\fIr\fP, int *\fIr_set\fP);
+int \fBlibj2_ji_mul_j2i_to_j2i_overflow_p\fP(intmax_t \fIa\fP, const struct libj2_j2i *\fIb\fP, struct libj2_j2i *\fIr\fP, int *\fIr_set\fP);
+
+void \fBlibj2_j2u_mul_j2u\fP(struct libj2_j2u *\fIa\fP, const struct libj2_j2u *\fIb\fP);
+void \fBlibj2_j2u_mul_j2u_to_j2u\fP(const struct libj2_j2u *\fIa\fP, const struct libj2_j2u *\fIb\fP, struct libj2_j2u *\fIr\fP);
+void \fBlibj2_j2u_mul_ju\fP(struct libj2_j2u *\fIa\fP, uintmax_t \fIb\fP);
+void \fBlibj2_j2u_mul_ju_to_j2u\fP(const struct libj2_j2u *\fIa\fP, uintmax_t \fIb\fP, struct libj2_j2u *\fIr\fP);
+void \fBlibj2_ju_mul_j2u_to_j2u\fP(uintmax_t \fIa\fP, const struct libj2_j2u *\fIb\fP, struct libj2_j2u *\fIr\fP);
+void \fBlibj2_ju_mul_ju_to_j2u\fP(uintmax_t \fIa\fP, uintmax_t \fIb\fP, struct libj2_j2u *\fIr\fP);
+void \fBlibj2_j2u_mul_j2u_destructive\fP(struct libj2_j2u *restrict \fIa\fP, struct libj2_j2u *restrict \fIb\fP);
+
+int \fBlibj2_j2u_mul_j2u_overflow\fP(struct libj2_j2u *\fIa\fP, const struct libj2_j2u *\fIb\fP);
+int \fBlibj2_j2u_mul_j2u_to_j2u_overflow\fP(const struct libj2_j2u *\fIa\fP, const struct libj2_j2u *\fIb\fP, struct libj2_j2u *\fIr\fP);
+int \fBlibj2_j2u_mul_ju_overflow\fP(struct libj2_j2u *\fIa\fP, uintmax_t \fIb\fP);
+int \fBlibj2_j2u_mul_ju_to_j2u_overflow\fP(const struct libj2_j2u *\fIa\fP, uintmax_t \fIb\fP, struct libj2_j2u *\fIr\fP);
+int \fBlibj2_ju_mul_j2u_to_j2u_overflow\fP(uintmax_t \fIa\fP, const struct libj2_j2u *\fIb\fP, struct libj2_j2u *\fIr\fP);
+int \fBlibj2_j2u_mul_j2u_overflow_destructive\fP(struct libj2_j2u *restrict \fIa\fP, struct libj2_j2u *restrict \fIb\fP);
+
+int \fBlibj2_j2u_mul_j2u_overflow_p\fP(const struct libj2_j2u *\fIa\fP, const struct libj2_j2u *\fIb\fP);
+int \fBlibj2_j2u_mul_ju_overflow_p\fP(const struct libj2_j2u *\fIa\fP, uintmax_t \fIb\fP);
+int \fBlibj2_ju_mul_j2u_overflow_p\fP(uintmax_t \fIa\fP, const struct libj2_j2u *\fIb\fP);
+
+enum libj2_overflow \fBlibj2_j2u_mul_j2u_overflow_p_quick\fP(const struct libj2_j2u *\fIa\fP, const struct libj2_j2u *\fIb\fP);
+enum libj2_overflow \fBlibj2_j2u_mul_ju_overflow_p_quick\fP(const struct libj2_j2u *\fIa\fP, uintmax_t \fIb\fP);
+enum libj2_overflow \fBlibj2_ju_mul_j2u_overflow_p_quick\fP(uintmax_t \fIa\fP, const struct libj2_j2u *\fIb\fP);
+
+int \fBlibj2_j2u_mul_j2u_to_j2u_overflow_p\fP(const struct libj2_j2u *\fIa\fP, const struct libj2_j2u *\fIb\fP, struct libj2_j2u *\fIr\fP, int *\fIr_set\fP);
+int \fBlibj2_j2u_mul_ju_to_j2u_overflow_p\fP(const struct libj2_j2u *\fIa\fP, uintmax_t \fIb\fP, struct libj2_j2u *\fIr\fP, int *\fIr_set\fP);
+int \fBlibj2_ju_mul_j2u_to_j2u_overflow_p\fP(uintmax_t \fIa\fP, const struct libj2_j2u *\fIb\fP, struct libj2_j2u *\fIr\fP, int *\fIr_set\fP);
+.fi
+.PP
+Link with
+.IR -lj2 .
+
+.SH DESCRIPTION
+The above listed functions calculate the
+product of the values of
+.I a
+and
+.IR b .
+The functions with the parameter
+.I r
+store the result in
+.IR r ,
+the other functions store the result in
+.IR a ,
+except the functions
+.BR libj2_j2i_mul_j2i_overflow_p (),
+.BR libj2_j2i_mul_ji_overflow_p (),
+.BR libj2_ji_mul_j2i_overflow_p (),
+.BR libj2_j2u_mul_j2u_overflow_p (),
+.BR libj2_j2u_mul_ju_overflow_p (),
+.BR libj2_ju_mul_j2u_overflow_p (),
+.BR libj2_j2i_mul_j2i_overflow_p_quick (),
+.BR libj2_j2i_mul_ji_overflow_p_quick (),
+.BR libj2_ji_mul_j2i_overflow_p_quick (),
+.BR libj2_j2u_mul_j2u_overflow_p_quick (),
+.BR libj2_j2u_mul_ju_overflow_p_quick (),
+and
+.BR libj2_ju_mul_j2u_overflow_p_quick ()
+only predict overflow, and do not calculate
+the sum, and therefore does store it anywhere.
+.PP
+Additionally, in situations where the
+.BR libj2_j2i_mul_j2i_overflow_p_quick (),
+.BR libj2_j2i_mul_ji_overflow_p_quick (),
+.BR libj2_ji_mul_j2i_overflow_p_quick (),
+.BR libj2_j2u_mul_j2u_overflow_p_quick (),
+.BR libj2_j2u_mul_ju_overflow_p_quick (),
+and
+.BR libj2_ju_mul_j2u_overflow_p_quick ()
+functions return
+.I LIBJ2_POSITIVE_OVERFLOW_UNKNOWN
+or
+.IR LIBJ2_NEGATIVE_OVERFLOW_UNKNOWN ,
+the
+.BR libj2_j2i_mul_j2i_to_j2i_overflow_p ()
+.BR libj2_j2i_mul_ji_to_j2i_overflow_p ()
+.BR libj2_ji_mul_j2i_to_j2i_overflow_p ()
+.BR libj2_j2u_mul_j2u_to_j2u_overflow_p ()
+.BR libj2_j2u_mul_ju_to_j2u_overflow_p (),
+and
+.BR libj2_ju_mul_j2u_to_j2u_overflow_p ()
+functions will calculate the product, store it in
+.I r
+and set
+.I *r_set
+to 1; in other situations, those functions will
+not modify
+.I r
+but will set
+.I *r_set
+to 0.
+.PP
+The value-returning functions (that is, those
+with word
+.B overflow
+in their name), detect arithmetic overflow.
+.PP
+The result is truncated to the least significant
+bits, as many as can be stored, in case of overflow;
+that is, modular arithmetics is used.
+.PP
+The
+.BR libj2_j2u_mul_j2u_destructive ()
+and
+.BR libj2_j2u_mul_j2u_overflow_destructive ()
+functions modifies
+.I b
+arbitrarily, and do not support
+.I a
+and
+.I b
+being the same pointer.
+.PP
+The arguments are assumed to be
+.RI non- NULL .
+
+.SH RETURN VALUE
+For functions with a return value, the functions
+return +1 if the result is positive but too large
+to be represented, -1 if the result is negative
+(not only possible with functions where the result is a
+.IR "struct libj2_j2i" )
+but too large, and 0 otherwise.
+For the
+.BR libj2_j2i_mul_j2i_overflow_p_quick (),
+.BR libj2_j2i_mul_ji_overflow_p_quick (),
+.BR libj2_ji_mul_j2i_overflow_p_quick (),
+.BR libj2_j2u_mul_j2u_overflow_p_quick (),
+.BR libj2_j2u_mul_ju_overflow_p_quick (),
+and
+.BR libj2_ju_mul_j2u_overflow_p_quick ()
+functions, the return value is a
+.BR "enum libj2_overflow" ,
+which may be unsigned, so to check if the
+return value was negative, it is best to
+first cast it to an integer, or compare it
+directly to the negative constants. Additionally,
+these functions will return
+.I LIBJ2_POSITIVE_OVERFLOW_UNKNOWN
+if the result is positive but if could not
+be determined without calculating the
+product whether the product is too large to
+be represented, and
+.I LIBJ2_NEGATIVE_OVERFLOW_UNKNOWN
+if the result is negative but if could not
+be determined without calculating the
+product whether the product is too large to
+be represented.
+.PP
+Since the
+.BR libj2_j2u_mul_j2u_overflow_p_quick (),
+.BR libj2_j2u_mul_ju_overflow_p_quick (),
+and
+.BR libj2_ju_mul_j2u_overflow_p_quick ()
+functions operate on unsigned integers, they
+will never return
+.I LIBJ2_NEGATIVE_OVERFLOW
+or
+.IR LIBJ2_NEGATIVE_OVERFLOW_UNKNOWN .
+
+.SH ERRORS
+The above listed functions cannot fail.
+
+.SH HISTORY
+The
+.BR libj2_j2u_mul_j2u (),
+.BR libj2_j2u_mul_j2u_to_j2u (),
+.BR libj2_j2u_mul_ju (),
+.BR libj2_j2u_mul_ju_to_j2u (),
+.BR libj2_ju_mul_j2u_to_j2u (),
+.BR libj2_ju_mul_ju_to_j2u (),
+.BR libj2_j2u_mul_j2u_destructive (),
+.BR libj2_j2u_mul_j2u_overflow (),
+.BR libj2_j2u_mul_j2u_to_j2u_overflow (),
+.BR libj2_j2u_mul_ju_overflow (),
+.BR libj2_j2u_mul_ju_to_j2u_overflow (),
+.BR libj2_ju_mul_j2u_to_j2u_overflow (),
+.BR libj2_j2u_mul_j2u_overflow_destructive (),
+.BR libj2_j2u_mul_j2u_overflow_p (),
+.BR libj2_j2u_mul_ju_overflow_p (),
+.BR libj2_ju_mul_j2u_overflow_p (),
+.BR libj2_j2u_mul_j2u_overflow_p_quick (),
+.BR libj2_j2u_mul_ju_overflow_p_quick (),
+.BR libj2_ju_mul_j2u_overflow_p_quick (),
+.BR libj2_j2u_mul_j2u_to_j2u_overflow_p (),
+.BR libj2_j2u_mul_ju_to_j2u_overflow_p (),
+and
+.BR libj2_ju_mul_j2u_to_j2u_overflow_p ()
+functions and the
+.IR LIBJ2_NO_OVERFLOW ,
+.IR LIBJ2_OVERFLOW ,
+and
+.IR LIBJ2_OVERFLOW_UNKNOWN
+constants were added in version 1.0 of
+.BR libj2 .
+.PP
+The
+.BR libj2_j2i_mul_j2i (),
+.BR libj2_j2i_mul_j2i_to_j2i (),
+.BR libj2_j2i_mul_ji (),
+.BR libj2_j2i_mul_ji_to_j2i (),
+.BR libj2_ji_mul_j2i_to_j2i (),
+.BR libj2_ji_mul_ji_to_j2i (),
+.BR libj2_j2i_mul_j2i_overflow (),
+.BR libj2_j2i_mul_j2i_to_j2i_overflow (),
+.BR libj2_j2i_mul_ji_overflow (),
+.BR libj2_j2i_mul_ji_to_j2i_overflow (),
+.BR libj2_ji_mul_j2i_to_j2i_overflow (),
+.BR libj2_j2i_mul_j2i_overflow_p (),
+.BR libj2_j2i_mul_ji_overflow_p (),
+.BR libj2_ji_mul_j2i_overflow_p (),
+.BR libj2_j2i_mul_j2i_overflow_p_quick (),
+.BR libj2_j2i_mul_ji_overflow_p_quick (),
+.BR libj2_ji_mul_j2i_overflow_p_quick (),
+.BR libj2_j2i_mul_j2i_to_j2i_overflow_p (),
+.BR libj2_j2i_mul_ji_to_j2i_overflow_p (),
+and
+.BR libj2_ji_mul_j2i_to_j2i_overflow_p ()
+functions and the
+.IR LIBJ2_POSITIVE_OVERFLOW ,
+.IR LIBJ2_POSITIVE_OVERFLOW_UNKNOWN ,
+.IR LIBJ2_NEGATIVE_OVERFLOW ,
+and
+.IR LIBJ2_NEGATIVE_OVERFLOW_UNKNOWN
+constants were added in version 1.1 of
+.BR libj2 .
+
+.SH SEE ALSO
+.BR libj2 (7),
+.BR libj2_j2i_add_j2i (3),
+.BR libj2_j2i_sub_j2i (3),
+.BR libj2_j2u_sub_j2u (3),
+.BR libj2_j2i_divmod_j2i (3)