1 ;;; GNU Guix --- Functional package management for GNU
2 ;;; Copyright © 2012, 2013, 2015 Ludovic Courtès <ludo@gnu.org>
3 ;;; Copyright © 2014 Mark H Weaver <mhw@netris.org>
4 ;;; Copyright © 2015, 2018 Andreas Enge <andreas@enge.fr>
5 ;;; Copyright © 2016 Nicolas Goaziou <mail@nicolasgoaziou.fr>
6 ;;; Copyright © 2016, 2020 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
7 ;;; Copyright © 2018, 2019 Tobias Geerinckx-Rice <me@tobias.gr>
8 ;;; Copyright © 2018 Eric Bavier <bavier@member.fsf.org>
9 ;;; Copyright © 2018, 2019 Efraim Flashner <efraim@flashner.co.il>
11 ;;; This file is part of GNU Guix.
13 ;;; GNU Guix is free software; you can redistribute it and/or modify it
14 ;;; under the terms of the GNU General Public License as published by
15 ;;; the Free Software Foundation; either version 3 of the License, or (at
16 ;;; your option) any later version.
18 ;;; GNU Guix is distributed in the hope that it will be useful, but
19 ;;; WITHOUT ANY WARRANTY; without even the implied warranty of
20 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 ;;; GNU General Public License for more details.
23 ;;; You should have received a copy of the GNU General Public License
24 ;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
26 (define-module (gnu packages multiprecision)
27 #:use-module (guix licenses)
28 #:use-module (gnu packages)
29 #:use-module (gnu packages autotools)
30 #:use-module (gnu packages m4)
31 #:use-module (gnu packages gcc)
32 #:use-module (guix packages)
33 #:use-module (guix download)
34 #:use-module (guix utils)
35 #:use-module (guix build-system gnu))
44 (string-append "mirror://gnu/gmp/gmp-"
48 "09hmg8k63mbfrx1x3yy6y1yzbbq85kw5avbibhcgrg9z3ganr3i5"))
49 (patches (search-patches "gmp-faulty-test.patch"))))
50 (build-system gnu-build-system)
51 (native-inputs `(("m4" ,m4)))
52 (outputs '("out" "debug"))
54 `(#:parallel-tests? #f ; mpz/reuse fails otherwise
56 '(;; Build a "fat binary", with routines for several
60 ,@(cond ((target-mingw?)
61 ;; Static and shared cannot be built in one go:
62 ;; they produce different headers. We need shared.
66 ;; Remove after core-updates merge.
67 ;; Workaround for gcc-7 transition breakage, -system and cross-build,
68 ;; Note: See <http://bugs.gnu.org/22186> for why not 'CPATH'.
69 ;; Note: See <http://bugs.gnu.org/30756> for why not 'C_INCLUDE_PATH' & co.
72 (modify-phases %standard-phases
73 (add-before 'configure 'setenv
75 (let ((gcc (assoc-ref %build-inputs "cross-gcc"))
76 (libc (assoc-ref %build-inputs "cross-libc")))
77 (setenv "CROSS_CPLUS_INCLUDE_PATH"
78 (string-append gcc "/include/c++"
81 (format #t "environment variable `CROSS_CPLUS_INCLUDE_PATH' set to `~a'\n"
82 (getenv "CROSS_CPLUS_INCLUDE_PATH"))
85 (synopsis "Multiple-precision arithmetic library")
87 "The @acronym{GMP, the GNU Multiple Precision Arithmetic} library performs
88 arbitrary-precision arithmetic on signed integers, rational numbers and floating
89 point numbers. The precision is only limited by the available memory.
90 The library is highly optimized, with a design focus on execution speed.
91 It is aimed at use in, for example, cryptography and computational algebra.")
93 (home-page "https://gmplib.org/")))
95 (define-public gmp-6.0
96 ;; We keep this one around to bootstrap GCC, to work around a compilation
98 ;; <https://gmplib.org/list-archives/gmp-bugs/2015-December/003848.html>.
104 (uri (string-append "mirror://gnu/gmp/gmp-"
108 "0r5pp27cy7ch3dg5v0rsny8bib1zfvrza6027g2mp5f6v8pd6mli"))
109 (patches (search-patches "gmp-arm-asm-nothumb.patch"
110 "gmp-faulty-test.patch"))))))
118 (uri (string-append "mirror://gnu/mpfr/mpfr-" version
121 "12m3amcavhpqygc499s3fzqlb8f2j2rr7fkqsm10xbjfc04fffqx"))))
122 (build-system gnu-build-system)
123 (outputs '("out" "debug"))
124 (propagated-inputs `(("gmp" ,gmp))) ; <mpfr.h> refers to <gmp.h>
125 (synopsis "C library for arbitrary-precision floating-point arithmetic")
127 "GNU@tie{}@acronym{MPFR, Multiple Precision Floating-Point Reliably} is a C
128 library for performing multiple-precision, floating-point computations with
131 (home-page "https://www.mpfr.org/")))
140 "mirror://gnu/mpc/mpc-" version ".tar.gz"))
143 "0biwnhjm3rx3hc0rfpvyniky4lpzsvdcwhmcn7f0h4iw2hwcb1b9"))))
144 (build-system gnu-build-system)
145 (outputs '("out" "debug"))
146 (propagated-inputs `(("gmp" ,gmp) ; <mpc.h> refers to both
148 (synopsis "C library for arbitrary-precision complex arithmetic")
150 "GNU@tie{}@acronym{MPC, Multiple Precision Complex library} is a C library
151 for performing arithmetic on complex numbers. It supports arbitrarily high
152 precision and correctly rounds the results.")
154 (home-page "http://www.multiprecision.org/mpc/")))
163 (uri (string-append "https://gforge.inria.fr/frs/download.php"
164 "/latestfile/181/" name "-" version ".tar.bz2"))
166 (base32 "0bqr8yibl7jbrp0bw7xk1lm7nis7rv26jsz6y8ycvih8n9bx90r3"))))
167 (build-system gnu-build-system)
168 (propagated-inputs `(("gmp" ,gmp) ; <mpfi.h> refers to both
170 (synopsis "C library for arbitrary-precision interval arithmetic")
172 "@acronym{MPFI, Multiple Precision Floating-point Interval} is a portable C
173 library for arbitrary-precision interval arithmetic, with intervals represented
174 using MPFR reliable floating-point numbers. It's based on the @acronym{GMP, GNU
175 Multiple Precision Arithmetic} and GNU@tie{}@acronym{MPFR, Multiple Precision
176 Floating-Point Reliably} libraries.
178 The purpose of arbitrary-precision interval arithmetic is to get results that
179 are both guaranteed, thanks to interval computation, and accurate, thanks to
180 multiple-precision arithmetic.")
182 (home-page "https://perso.ens-lyon.fr/nathalie.revol/software.html")))
191 (uri (string-append "http://irram.uni-trier.de/irram-files/iRRAM_"
194 (base32 "1cdmvb4hsa161rfdjqyhd9sb3fcr43p3a6nsj7cb4kn9f94qmjpj"))))
195 (build-system gnu-build-system)
196 (propagated-inputs `(("gmp" ,gmp) ; <mpfi.h> refers to both
199 `(#:parallel-build? #f))
200 (synopsis "C++ package for real arithmetic based on the Real-RAM concept")
202 "@dfn{iRRAM} is a C++ package for error-free real arithmetic based on
203 the concept of a Real-RAM. Its capabilities range from ordinary arithmetic
204 over trigonometric functions to linear algebra and differential
205 equations. A program using iRRAM is coded in ordinary C++, but may use a
206 special class that behaves like real numbers without any
207 error. Additionally, iRRAM uses the concept of multi-valued functions.")
209 (home-page "http://irram.uni-trier.de/")))
218 (uri (string-append "https://crd-legacy.lbl.gov/~dhbailey/mpdist/qd-"
221 (base32 "1lq609rsp6zpg7zda75lyxzzk1fabzp4jn88j7xfk84mdgjgzh9h"))))
222 (build-system gnu-build-system)
224 `(("gfortran" ,gfortran)))
226 `(#:configure-flags `("--disable-enable_fma" ;weird :/
228 ,,@(if (string-prefix? "aarch64"
229 (or (%current-target-system)
231 ;; XXX: The qd_test test fails numerical
232 ;; accuracy checks for 'dd_real::exp()' on
233 ;; aarch64 with GCC 5.4 at -O2. Disabling
234 ;; expensive optimizations lets it pass.
235 '("CXXFLAGS=-O3 -fno-expensive-optimizations")
236 '("CXXFLAGS=-O3")))))
237 (home-page "https://www.davidhbailey.com/dhbsoftware/")
238 (synopsis "Double-double and quad-double library")
239 (description "This package supports both a double-double
240 datatype (approx. 32 decimal digits) and a quad-double datatype (approx. 64
241 decimal digits). The computational library is written in C++. Both C++ and
242 Fortran-90 high-level language interfaces are provided to permit one to
243 convert an existing C++ or Fortran-90 program to use the library with only
244 minor changes to the source code. In most cases only a few type statements
245 and (for Fortran-90 programs) read/write statements need to be changed. PSLQ
246 and numerical quadrature programs are included.")
249 (define-public tomsfastmath
251 (name "tomsfastmath")
253 (synopsis "Large integer arithmetic library")
256 (uri (string-append "https://github.com/libtom/tomsfastmath/"
257 "releases/download/v" version "/"
258 "tfm-" version ".tar.xz"))
261 "0f0pmiaskh89sp0q933pafxb914shpaj5ad8sb5rzk1wv8d7mja7"))))
262 (build-system gnu-build-system)
264 `(("libtool" ,libtool)))
266 `(#:make-flags (list "-f" "makefile.shared"
267 (string-append "LIBPATH=" %output "/lib")
268 (string-append "INCPATH=" %output "/include")
269 "GROUP=root" "USER=root"
272 (modify-phases %standard-phases
273 (delete 'configure) ; no configuration
275 (lambda* (#:key make-flags #:allow-other-keys)
277 "stest" "test_standalone"
281 (add-before 'install 'install-nogroup
283 ;; Let permissions inherit from the current process.
284 (substitute* "makefile.shared"
285 (("-g \\$\\(GROUP\\) -o \\$\\(USER\\)") ""))
287 (add-after 'install 'install-doc
288 (lambda* (#:key outputs #:allow-other-keys)
289 (let ((docdir (string-append (assoc-ref outputs "out")
290 "/share/doc/tomsfastmath")))
291 (install-file "doc/tfm.pdf" docdir)
293 (add-after 'install 'install-pc
294 (lambda* (#:key outputs #:allow-other-keys)
295 (let* ((out (assoc-ref outputs "out"))
296 (pc-dir (string-append out "/lib/pkgconfig")))
297 (call-with-output-file "tomsfastmath.pc"
303 Libs: -L~a/lib -ltfm~%"
304 ,synopsis ,version out)))
305 (install-file "tomsfastmath.pc" pc-dir)
307 (home-page "https://www.libtom.net/TomsFastMath/")
308 (description "TomsFastMath is a large integer library written in portable
309 ISO C. It is a port of LibTomMath with optional support for inline assembler
311 (license public-domain)))
313 (define-public libtommath
317 (outputs '("out" "static"))
321 (uri (string-append "https://github.com/libtom/libtommath/releases/"
322 "download/v" version "/ltm-" version ".tar.xz"))
325 "1c8q1qy88cjhdjlk3g24mra94h34c1ldvkjz0n2988c0yvn5xixp"))))
326 (build-system gnu-build-system)
329 (modify-phases %standard-phases
330 (delete 'configure) ; no configure
331 (add-after 'unpack 'prepare-build
333 ;; We want the shared library by default so force it to be the
334 ;; default makefile target.
335 (delete-file "makefile")
336 (symlink "makefile.shared" "makefile")
338 (add-after 'install 'remove-static-library
339 (lambda* (#:key outputs #:allow-other-keys)
340 (delete-file (string-append (assoc-ref outputs "out")
341 "/lib/libtommath.a"))
344 (lambda* (#:key test-target make-flags #:allow-other-keys)
345 (apply invoke "make" test-target make-flags)
346 (invoke "sh" "test")))
347 (add-after 'install 'install-static-library
348 (lambda* (#:key outputs #:allow-other-keys)
349 (invoke "make" "-f" "makefile.unix" "install"
350 (string-append "PREFIX=" (assoc-ref outputs "static"))
351 (string-append "CC=" (which "gcc"))))))
353 #:make-flags (list (string-append "PREFIX=" (assoc-ref %outputs "out"))
356 `(("libtool" ,libtool)))
357 (home-page "https://www.libtom.net/LibTomMath/")
358 (synopsis "Portable number theoretic multiple-precision integer library")
359 (description "LibTomMath is a portable number theoretic multiple-precision
360 integer library written entirely in C. It's designed to provide an API that is
361 simple to work with that provides fairly efficient routines that build out of
362 the box without configuration.")
363 (license unlicense)))
365 (define-public libtommath-1.1
372 (uri (string-append "https://github.com/libtom/libtommath/releases/"
373 "download/v" version "/ltm-" version ".tar.xz"))
376 "1bbyagqzfdbg37k1n08nsqzdf44z8zsnjjinqbsyj7rxg246qilh"))
377 (patches (search-patches "libtommath-fix-linkage.patch"))))
379 (substitute-keyword-arguments (package-arguments libtommath)
381 `(modify-phases ,phases
382 (add-after 'unpack 'patch-coreutils-call
384 ;; Don't pull in coreutils.
385 (substitute* "makefile_include.mk"
386 (("arch") "uname -m"))
388 ((#:test-target _) "test_standalone")))))
390 (define-public libtommath-1.0
392 (inherit libtommath-1.1)
398 (uri (string-append "https://github.com/libtom/libtommath/releases/"
399 "download/v" version "/ltm-" version ".tar.xz"))
402 "0sbccdwbkfc680id2fi0x067j23biqcjqilwkk7y9339knrjy0s7"))))
404 (substitute-keyword-arguments (package-arguments libtommath-1.1)
406 `(modify-phases ,phases
407 (delete 'install-static-library)))))))