mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-20 11:11:24 +00:00
155 lines
4.6 KiB
Plaintext
155 lines
4.6 KiB
Plaintext
|
INSTALLING GMP
|
||
|
==============
|
||
|
|
||
|
These instructions are only for the impatient. Others should read the install
|
||
|
instructions in the manual, gmp.info. Use "info -f gmp.info", or, if you
|
||
|
don't have info, use type "C-h i g (gmp.info)Top" in emacs.
|
||
|
|
||
|
Here are short instructions how to install MP, and some examples that help you
|
||
|
get started using MP.
|
||
|
|
||
|
First, you need to compile, and optionally install, MP. Since you're
|
||
|
impatient, try this:
|
||
|
|
||
|
./configure; make
|
||
|
|
||
|
If that fails, or you care about the performance of MP, you need to read the
|
||
|
full instructions in the chapter "Installing MP", in the manual.
|
||
|
|
||
|
Next, you need to try some small test programs, for example the ones below.
|
||
|
|
||
|
In MP programs, all variables need to be initialized before they are assigned,
|
||
|
and cleared out before program flow leaves the scope in which it was declared.
|
||
|
Here is an example of a program that reads two numbers from the command line,
|
||
|
multiplies them, and prints the result to stdout.
|
||
|
|
||
|
#include <stdio.h>
|
||
|
#include <gmp.h> /* All MP programs need to include gmp.h */
|
||
|
|
||
|
main (int argc, char **argv)
|
||
|
{
|
||
|
mpz_t a, b, p;
|
||
|
|
||
|
/* Initialize variables */
|
||
|
mpz_init (a);
|
||
|
mpz_init (b);
|
||
|
mpz_init (p);
|
||
|
|
||
|
/* Assign a and b from base 10 strings in argv */
|
||
|
mpz_set_str (a, argv[1], 10);
|
||
|
mpz_set_str (b, argv[2], 10);
|
||
|
|
||
|
/* Multiply a and b and put the result in p */
|
||
|
mpz_mul (p, a, b);
|
||
|
|
||
|
/* Print p in base 10 */
|
||
|
mpz_out_str (stdout, 10, p);
|
||
|
fputc ('\n', stdout);
|
||
|
|
||
|
/* Clear out variables */
|
||
|
mpz_clear (a);
|
||
|
mpz_clear (b);
|
||
|
mpz_clear (p);
|
||
|
exit (0);
|
||
|
}
|
||
|
|
||
|
|
||
|
In practice, that example would be written like this instead:
|
||
|
|
||
|
#include <stdio.h>
|
||
|
#include <gmp.h>
|
||
|
|
||
|
main (int argc, char **argv)
|
||
|
{
|
||
|
mpz_t a, b, p;
|
||
|
|
||
|
/* Initialize and assign a and b from base 10 strings in argv */
|
||
|
mpz_init_set_str (a, argv[1], 10);
|
||
|
mpz_init_set_str (b, argv[2], 10);
|
||
|
/* Initialize p */
|
||
|
mpz_init (p);
|
||
|
|
||
|
/* Multiply a and b and put the result in p */
|
||
|
mpz_mul (p, a, b);
|
||
|
|
||
|
/* Print p in base 10 */
|
||
|
mpz_out_str (stdout, 10, p);
|
||
|
fputc ('\n', stdout);
|
||
|
|
||
|
/* Since we're about to exit, no need to clear out variables */
|
||
|
exit (0);
|
||
|
}
|
||
|
|
||
|
Finally, you have to compile your test program, and link it with the MP
|
||
|
library. Assuming your working directory is still the gmp source directory,
|
||
|
type:
|
||
|
|
||
|
gcc -g -I. example.c libgmp.a
|
||
|
|
||
|
|
||
|
Now try to run the example:
|
||
|
|
||
|
a.out 98365871231256752134 319378318340103345227
|
||
|
31415926535897932384618573336104570964418
|
||
|
|
||
|
The functions used here all operate on the domain of signed integers.
|
||
|
Functions operating on that domain have names starting with "mpz_". There are
|
||
|
many more such functions than used in these examples. See the chapter
|
||
|
"Integer Functions" in the manual, for a complete list.
|
||
|
|
||
|
There are two other main classes of functions in MP. They operate on rational
|
||
|
numbers and floating-point numbers, respectively. The chapters "Rational
|
||
|
Number Functions", and "Floating-point Functions" documents these classes.
|
||
|
|
||
|
To run a set of tests, do "make check". This will take a while.
|
||
|
|
||
|
To create the printable documentation from the texinfo source, type "make
|
||
|
dvi". This requires the "tex" command to be available in your search path.
|
||
|
|
||
|
To install the library, do "make install".
|
||
|
|
||
|
If you decide to use MP, It is a good idea you read at least the chapter "MP
|
||
|
Basics" in the manual.
|
||
|
|
||
|
|
||
|
Known Build Problems
|
||
|
--------------------
|
||
|
|
||
|
Note that GCC 2.7.2 (as well as 2.6.3) for the RS/6000 and PowerPC can not
|
||
|
be used to compile GMP, due to a bug in GCC. If you want to use GCC, you
|
||
|
need to apply the patch at the end of this file, or use a later version of
|
||
|
the compiler.
|
||
|
|
||
|
If you are on a Sequent Symmetry, use GAS instead of the system's assembler
|
||
|
due to the latter's serious bugs.
|
||
|
|
||
|
The system compiler on NeXT is a massacred and old gcc, even if the
|
||
|
compiler calls itself cc. This compiler cannot be used to build GMP. You
|
||
|
need to get a real gcc, and install that before you compile GMP. (NeXT
|
||
|
might have fixed this in newer releases of their system.)
|
||
|
|
||
|
Please report other problems to bug-gmp@prep.ai.mit.edu.
|
||
|
|
||
|
|
||
|
Patch to apply to GCC 2.6.3 and 2.7.2:
|
||
|
|
||
|
*** config/rs6000/rs6000.md Sun Feb 11 08:22:11 1996
|
||
|
--- config/rs6000/rs6000.md.new Sun Feb 18 03:33:37 1996
|
||
|
***************
|
||
|
*** 920,926 ****
|
||
|
(set (match_operand:SI 0 "gpc_reg_operand" "=r")
|
||
|
(not:SI (match_dup 1)))]
|
||
|
""
|
||
|
! "nor. %0,%2,%1"
|
||
|
[(set_attr "type" "compare")])
|
||
|
|
||
|
(define_insn ""
|
||
|
--- 920,926 ----
|
||
|
(set (match_operand:SI 0 "gpc_reg_operand" "=r")
|
||
|
(not:SI (match_dup 1)))]
|
||
|
""
|
||
|
! "nor. %0,%1,%1"
|
||
|
[(set_attr "type" "compare")])
|
||
|
|
||
|
(define_insn ""
|