Annotation of OpenXM_contrib/gmp/mpfr/mpfr.texi, Revision 1.1
1.1 ! ohara 1: \input texinfo @c -*-texinfo-*-
! 2: @c %**start of header
! 3: @setfilename mpfr.info
! 4: @settitle MPFR 2.0.1
! 5: @synindex tp fn
! 6: @iftex
! 7: @afourpaper
! 8: @end iftex
! 9: @comment %**end of header
! 10:
! 11: @ifinfo
! 12: @format
! 13: START-INFO-DIR-ENTRY
! 14: * mpfr: (mpfr.info). Multiple Precision Floating-Point Reliable Library.
! 15: END-INFO-DIR-ENTRY
! 16: @end format
! 17: @end ifinfo
! 18:
! 19: @c smallbook
! 20:
! 21: @iftex
! 22: @finalout
! 23: @end iftex
! 24:
! 25: @c Note: the edition number is listed in *three* places; please update
! 26: @c all three. Also, update the month and year where appropriate.
! 27:
! 28: @c ==> Update edition number for settitle and subtitle, and in the
! 29: @c ==> following paragraph; update date, too.
! 30:
! 31:
! 32: @ifinfo
! 33: This file documents MPFR, a library for reliable multiple precision floating-point arithmetic
! 34:
! 35: Copyright (C) 1999-2002, Free Software Foundation.
! 36:
! 37: Permission is granted to make and distribute verbatim copies of
! 38: this manual provided the copyright notice and this permission notice
! 39: are preserved on all copies.
! 40:
! 41: @ignore
! 42: Permission is granted to process this file through TeX and print the
! 43: results, provided the printed document carries copying permission
! 44: notice identical to this one except for the removal of this paragraph
! 45: (this paragraph not being relevant to the printed manual).
! 46:
! 47: @end ignore
! 48: Permission is granted to copy and distribute modified versions of this
! 49: manual under the conditions for verbatim copying, provided that the entire
! 50: resulting derived work is distributed under the terms of a permission
! 51: notice identical to this one.
! 52:
! 53: Permission is granted to copy and distribute translations of this manual
! 54: into another language, under the above conditions for modified versions,
! 55: except that this permission notice may be stated in a translation approved
! 56: by the Foundation.
! 57: @end ifinfo
! 58:
! 59: @setchapternewpage on
! 60: @titlepage
! 61: @c use the new format for titles
! 62:
! 63: @title MPFR
! 64: @subtitle The Multiple Precision Floating-Point Reliable Library
! 65: @subtitle Edition 2.0.1
! 66: @subtitle April 2002
! 67:
! 68: @author The MPFR team, LORIA/INRIA Lorraine
! 69:
! 70: @c Include the Distribution inside the titlepage so
! 71: @c that headings are turned off.
! 72:
! 73: @tex
! 74: \global\parindent=0pt
! 75: \global\parskip=8pt
! 76: \global\baselineskip=13pt
! 77: @end tex
! 78:
! 79: @page
! 80: @vskip 0pt plus 1filll
! 81: Copyright @copyright{} 1999-2002 Free Software Foundation
! 82:
! 83: @sp 2
! 84:
! 85: Published by the Free Software Foundation @*
! 86: 59 Temple Place - Suite 330 @*
! 87: Boston, MA 02111-1307, USA @*
! 88:
! 89: Permission is granted to make and distribute verbatim copies of
! 90: this manual provided the copyright notice and this permission notice
! 91: are preserved on all copies.
! 92:
! 93: Permission is granted to copy and distribute modified versions of this
! 94: manual under the conditions for verbatim copying, provided that the entire
! 95: resulting derived work is distributed under the terms of a permission
! 96: notice identical to this one.
! 97:
! 98: Permission is granted to copy and distribute translations of this manual
! 99: into another language, under the above conditions for modified versions,
! 100: except that this permission notice may be stated in a translation approved
! 101: by the Foundation.
! 102: @end titlepage
! 103: @headings double
! 104:
! 105: @ifinfo
! 106: @node Top, Copying, (dir), (dir)
! 107:
! 108: @top MPFR
! 109:
! 110: This manual documents how to install and use the Multiple Precision
! 111: Floating-Point Reliable Library, version 2.0.1
! 112:
! 113: @end ifinfo
! 114:
! 115: @menu
! 116: * Copying:: GMP Copying Conditions (LGPL).
! 117: * Introduction to MPFR:: Brief introduction to MPFR.
! 118: * Installing MPFR:: How to configure and compile the MPFR library.
! 119: * MPFR Basics:: What every MPFR user should now.
! 120: * Reporting Bugs:: How to usefully report bugs.
! 121: * Floating-point Functions:: Functions for arithmetic on floats.
! 122:
! 123: * Contributors::
! 124: * References::
! 125: * Concept Index::
! 126: * Function Index::
! 127: @end menu
! 128:
! 129: @node Copying, Introduction to MPFR, Top, Top
! 130: @comment node-name, next, previous, up
! 131: @unnumbered MPFR Copying Conditions
! 132: @cindex Copying conditions
! 133: @cindex Conditions for copying MPFR
! 134:
! 135: This library is @dfn{free}; this means that everyone is free to use it and
! 136: free to redistribute it on a free basis. The library is not in the public
! 137: domain; it is copyrighted and there are restrictions on its distribution, but
! 138: these restrictions are designed to permit everything that a good cooperating
! 139: citizen would want to do. What is not allowed is to try to prevent others
! 140: from further sharing any version of this library that they might get from
! 141: you.@refill
! 142:
! 143: Specifically, we want to make sure that you have the right to give away copies
! 144: of the library, that you receive source code or else can get it if you want
! 145: it, that you can change this library or use pieces of it in new free programs,
! 146: and that you know you can do these things.@refill
! 147:
! 148: To make sure that everyone has such rights, we have to forbid you to deprive
! 149: anyone else of these rights. For example, if you distribute copies of the
! 150: MPFR library, you must give the recipients all the rights that you have. You
! 151: must make sure that they, too, receive or can get the source code. And you
! 152: must tell them their rights.@refill
! 153:
! 154: Also, for our own protection, we must make certain that everyone finds out
! 155: that there is no warranty for the MPFR library. If it is modified by
! 156: someone else and passed on, we want their recipients to know that what they
! 157: have is not what we distributed, so that any problems introduced by others
! 158: will not reflect on our reputation.@refill
! 159:
! 160: The precise conditions of the license for the MPFR library are found in the
! 161: Lesser General Public License that accompanies the source code.
! 162: See the file COPYING.LIB.@refill
! 163:
! 164: @node Introduction to MPFR, Installing MPFR, Copying, Top
! 165: @comment node-name, next, previous, up
! 166: @chapter Introduction to MPFR
! 167:
! 168:
! 169: MPFR is a portable library written in C for arbitrary precision arithmetic
! 170: on reliable floating-point numbers. It is based on the GNU MP library.
! 171: It aims to extend the class of floating-point numbers provided by the
! 172: GNU MP library by @dfn{reliable} floating-point numbers. It may replace
! 173: the GNU MP floating-point numbers in a future release. The main differences
! 174: with the @code{mpf} class are:
! 175:
! 176: @itemize @bullet
! 177: @item the @code{mpfr} code is portable, i.e. the result of any operation
! 178: does not depend (or should not) on the machine word size
! 179: @code{mp_bits_per_limb} (32 or 64 on most machines);
! 180: @item the precision in bits can be set exactly to any valid value
! 181: for each variable (including very small precision);
! 182: @item @code{mpfr} provides the four rounding modes from the IEEE 754
! 183: standard.
! 184: @end itemize
! 185:
! 186: In particular, with a precision of 53 bits, @code{mpfr} should be able
! 187: to exactly reproduce all computations with double-precision machine
! 188: floating-point
! 189: numbers (@code{double} type in C), except the default exponent range
! 190: is much wider and subnormal numbers are not implemented.
! 191:
! 192: This version of MPFR is released under the GNU Lesser General Public
! 193: License.
! 194: It is permitted to link MPFR to non-free programs, as long as when
! 195: distributing them the MPFR source code and a means to re-link with a
! 196: modified MPFR is provided.
! 197:
! 198: @section How to use this Manual
! 199:
! 200: Everyone should read @ref{MPFR Basics}. If you need to install the library
! 201: yourself, you need to read @ref{Installing MPFR}, too.
! 202:
! 203: The rest of the manual can be used for later reference, although it is
! 204: probably a good idea to glance through it.
! 205:
! 206: @node Installing MPFR, Reporting Bugs, Introduction to MPFR, Top
! 207: @comment node-name, next, previous, up
! 208: @chapter Installing MPFR
! 209: @cindex Installation
! 210:
! 211: To build MPFR, you first have to install GNU MP
! 212: (version 4.0.1 or higher) on your computer.
! 213: You need a C compiler, preferably GCC, but any reasonable compiler should
! 214: work. And you need a standard Unix @samp{make} program, plus some other
! 215: standard Unix utility programs.
! 216:
! 217: Here are the steps needed to install the library on Unix systems
! 218: (more details are provided in the @file{INSTALL} file):
! 219:
! 220: @enumerate
! 221: @item
! 222: In most cases, @samp{./configure --with-gmp=/usr/local/gmp} should work,
! 223: where the directory @samp{/usr/local/gmp} is where you have installed
! 224: GNU MP.
! 225: When you install GNU MP, you have to copy the files
! 226: @samp{config.h},
! 227: @samp{gmp-impl.h}, @samp{gmp-mparam.h} and
! 228: @samp{longlong.h} from the GNU MP source directory
! 229: to @samp{/usr/local/gmp/include};
! 230: these additional files are needed by MPFR.
! 231: If you get error messages, you might check that you use the same compiler
! 232: and compile options as for GNU MP (see the @file{INSTALL} file).
! 233:
! 234: @item
! 235: @samp{make}
! 236:
! 237: This will compile MPFR, and create a library archive file @file{libmpfr.a}
! 238: in the working directory.
! 239:
! 240: @item
! 241: @samp{make check}
! 242:
! 243: This will make sure MPFR was built correctly.
! 244: If you get error messages, please
! 245: report this to @samp{mpfr@@loria.fr}. (@xref{Reporting Bugs}, for
! 246: information on what to include in useful bug reports.)
! 247:
! 248: @item
! 249: @samp{make install}
! 250:
! 251: This will copy the files @file{mpfr.h} and @file{mpf2mpfr.h},
! 252: and @file{libmpfr.a},
! 253: to the directories @file{/usr/local/include} and @file{/usr/local/lib}
! 254: respectively (or if you passed the @samp{--prefix} option to
! 255: @file{configure}, to the directory given as argument to @samp{--prefix}).
! 256: This will also install @file{mpfr.info} in @file{/usr/local/info}.
! 257: @end enumerate
! 258:
! 259: There are some other useful make targets:
! 260:
! 261: @itemize @bullet
! 262: @item
! 263: @samp{mpfr.dvi} or @samp{dvi}
! 264:
! 265: Create a DVI version of the manual, in @file{mpfr.dvi}.
! 266: @c and a set of info files, in @file{mpfr.info}, @file{mpfr.info-1}, @file{mpfr.info-2}, etc.
! 267:
! 268: @item
! 269: @samp{mpfr.ps}
! 270:
! 271: Create a Postscript version of the manual, in @file{mpfr.ps}.
! 272:
! 273: @c @item
! 274: @c @samp{html}
! 275: @c Create a HTML version of the manual, in @file{mpfr.html}.
! 276:
! 277: @item
! 278: @samp{clean}
! 279:
! 280: Delete all object files and archive files, but not the configuration files.
! 281:
! 282: @item
! 283: @samp{distclean}
! 284:
! 285: Delete all files not included in the distribution.
! 286:
! 287: @item
! 288: @samp{uninstall}
! 289: Delete all files copied by @samp{make install}.
! 290: @end itemize
! 291:
! 292:
! 293: @section Known Build Problems
! 294:
! 295: MPFR suffers from all bugs from the GNU MP library, plus many many more.
! 296:
! 297: Please report other problems to @samp{mpfr@@loria.fr}.
! 298: @xref{Reporting Bugs}.
! 299: Some bug fixes are available on the MPFR web page
! 300: @samp{http://www.loria.fr/projets/mpfr/} or @samp{http://www.mpfr.org/}.
! 301:
! 302:
! 303: @node Reporting Bugs, MPFR Basics, Installing MPFR, Top
! 304: @comment node-name, next, previous, up
! 305: @chapter Reporting Bugs
! 306: @cindex Reporting bugs
! 307:
! 308: If you think you have found a bug in the MPFR library, first have a look on the
! 309: MPFR web page @samp{http://www.loria.fr/projets/mpfr/} or
! 310: @samp{http://www.mpfr.org/}: perhaps this bug is already known,
! 311: in which case you will find a workaround for it.
! 312: Otherwise, please investigate
! 313: and report it. We have made this library available to you, and it is not to ask
! 314: too much from you, to ask you to report the bugs that you find.
! 315:
! 316: There are a few things you should think about when you put your bug report
! 317: together.
! 318:
! 319: You have to send us a test case that makes it possible for us to reproduce the
! 320: bug. Include instructions on how to run the test case.
! 321:
! 322: You also have to explain what is wrong; if you get a crash, or if the results
! 323: printed are incorrect and in that case, in what way.
! 324:
! 325: Please include compiler version information
! 326: in your bug report. This can be extracted using @samp{cc -V} on some
! 327: machines, or,
! 328: if you're using gcc, @samp{gcc -v}. Also, include the output from @samp{uname
! 329: -a}.
! 330:
! 331: If your bug report is good, we will do our best to help you to get a corrected
! 332: version of the library; if the bug report is poor, we won't do anything about
! 333: it (aside of chiding you to send better bug reports).
! 334:
! 335: Send your bug report to: @samp{mpfr@@loria.fr}.
! 336:
! 337: If you think something in this manual is unclear, or downright incorrect, or if
! 338: the language needs to be improved, please send a note to the same address.
! 339:
! 340: @node MPFR Basics, Floating-point Functions, Reporting Bugs, Top
! 341: @comment node-name, next, previous, up
! 342: @chapter MPFR Basics
! 343:
! 344:
! 345: @cindex @file{mpfr.h}
! 346: All declarations needed to use MPFR are collected in the include file
! 347: @file{mpfr.h}. It is designed to work with both C and C++ compilers.
! 348: You should include that file in any program using the MPFR library:
! 349:
! 350: @code{#include "mpfr.h"}
! 351:
! 352: @section Nomenclature and Types
! 353:
! 354: @cindex Floating-point number
! 355: @tindex @code{mpfr_t}
! 356: @noindent
! 357: @dfn{Floating-point number} or @dfn{Float} for short, is an arbitrary precision
! 358: mantissa with a limited precision exponent. The C data type for such objects
! 359: is @code{mpfr_t}.
! 360: A floating-point number can have three special values: Not-a-Number (NaN)
! 361: or plus or minus Infinity. NaN represents a value which cannot be represented
! 362: in the floating-point format, like 0 divided by 0, or Infinity minus Infinity.
! 363:
! 364:
! 365: @cindex Precision
! 366: @tindex @code{mp_prec_t}
! 367: @noindent
! 368: The @dfn{Precision} is the number of bits used to represent the mantissa
! 369: of a floating-point number;
! 370: the corresponding C data type is @code{mp_prec_t}.
! 371: The precision can be any integer between @code{MPFR_PREC_MIN} and
! 372: @code{MPFR_PREC_MAX}. In the current implementation, @code{MPFR_PREC_MIN}
! 373: is equal to 2 and @code{MPFR_PREC_MAX} is equal to @code{ULONG_MAX}.
! 374:
! 375: @cindex Rounding Mode
! 376: @tindex @code{mp_rnd_t}
! 377: @noindent
! 378: The @dfn{rounding mode} specifies the way to round the result of a
! 379: floating-point operation, in case the exact result can not be represented
! 380: exactly in the destination mantissa;
! 381: the corresponding C data type is @code{mp_rnd_t}.
! 382:
! 383: @cindex Limb
! 384: @c @tindex @code{mp_limb_t}
! 385: @noindent
! 386: A @dfn{limb} means the part of a multi-precision number that fits in a single
! 387: word. (We chose this word because a limb of the human body is analogous to a
! 388: digit, only larger, and containing several digits.) Normally a limb contains
! 389: 32 or 64 bits. The C data type for a limb is @code{mp_limb_t}.
! 390:
! 391: @section Function Classes
! 392:
! 393: There is only one class of functions in the MPFR library:
! 394:
! 395: @enumerate
! 396: @item
! 397: Functions for floating-point arithmetic, with names beginning with
! 398: @code{mpfr_}. The associated type is @code{mpfr_t}.
! 399: @end enumerate
! 400:
! 401:
! 402: @section MPFR Variable Conventions
! 403:
! 404: As a general rule, all MPFR functions expect output arguments before input
! 405: arguments. This notation is based on an analogy with the assignment operator.
! 406:
! 407: MPFR allows you to use the same variable for both input and output in the same
! 408: expression. For example, the main function for floating-point multiplication,
! 409: @code{mpfr_mul}, can be used like this: @code{mpfr_mul (x, x, x, rnd_mode)}.
! 410: This
! 411: computes the square of @var{x} with rounding mode @code{rnd_mode}
! 412: and puts the result back in @var{x}.
! 413:
! 414: Before you can assign to an MPFR variable, you need to initialize it by calling
! 415: one of the special initialization functions. When you're done with a
! 416: variable, you need to clear it out, using one of the functions for that
! 417: purpose.
! 418:
! 419: A variable should only be initialized once, or at least cleared out between
! 420: each initialization. After a variable has been initialized, it may be
! 421: assigned to any number of times.
! 422:
! 423: For efficiency reasons, avoid to initialize and clear out a variable in loops.
! 424: Instead, initialize it before entering the loop, and clear it out after the
! 425: loop has exited.
! 426:
! 427: You don't need to be concerned about allocating additional space for MPFR
! 428: variables, since any variable has a mantissa of fixed size.
! 429: Hence unless you change its precision, or clear and reinitialize it,
! 430: a floating-point variable will have the same allocated space during all its
! 431: life.
! 432:
! 433: @section Compatibility with MPF
! 434:
! 435: A header file @file{mpf2mpfr.h} is included in the distribution of MPFR for
! 436: compatibility with the GNU MP class MPF.
! 437: After inserting the following two lines after the @code{#include "gmp.h"}
! 438: line,
! 439:
! 440: @code{#include "mpfr.h"}
! 441:
! 442: @code{#include "mpf2mpfr.h"}
! 443:
! 444: any program written for
! 445: MPF can be linked directly with MPFR without any changes.
! 446: All operations are then performed with the default MPFR rounding mode,
! 447: which can be reset with @code{mpfr_set_default_rounding_mode}.
! 448:
! 449: @deftypevr {Global Variable} {mp_rnd_t} __gmp_default_rounding_mode
! 450: The default rounding mode (to nearest initially).
! 451: @end deftypevr
! 452:
! 453: @section Getting the Latest Version of MPFR
! 454:
! 455: The latest version of MPFR is available from
! 456: @samp{http://www.loria.fr/projets/mpfr/} or @samp{http://www.mpfr.org/}.
! 457:
! 458: @node Floating-point Functions, Contributors, MPFR Basics, Top
! 459: @comment node-name, next, previous, up
! 460: @chapter Floating-point Functions
! 461: @cindex Floating-point functions
! 462: @cindex Float functions
! 463:
! 464: The floating-point functions expect arguments of type @code{mpfr_t}.
! 465:
! 466: The MPFR floating-point functions have an interface that is similar to the
! 467: GNU MP
! 468: integer functions. The function prefix for floating-point operations is
! 469: @code{mpfr_}.
! 470:
! 471: There is one significant characteristic of floating-point numbers that has
! 472: motivated a difference between this function class and other MPFR function
! 473: classes: the inherent inexactness of floating-point arithmetic. The user has
! 474: to specify the precision of each variable. A computation that assigns a
! 475: variable will take place with the precision of the assigned variable; the
! 476: cost of that computation should not depend from the
! 477: precision of variables used as input on average.
! 478:
! 479: @cindex User-defined precision
! 480: The precision of a calculation is defined as follows: Compute the requested
! 481: operation exactly (with ``infinite precision''), and round the result to
! 482: the destination variable precision with the given rounding mode.
! 483: Even if the user has asked for a very
! 484: high precision, MP will not calculate with superfluous digits. For example,
! 485: if two low-precision numbers of nearly equal magnitude are added, the
! 486: precision of the result will be limited to what is required to represent the
! 487: result accurately.
! 488:
! 489: The MPFR floating-point functions are intended to be a smooth extension
! 490: of the IEEE P754 arithmetic. The results obtained on one
! 491: computer should not differ from the results obtained on a computer with a
! 492: different word size.
! 493:
! 494: @menu
! 495: * Rounding Modes::
! 496: * Exceptions::
! 497: * Initializing Floats::
! 498: * Assigning Floats::
! 499: * Simultaneous Float Init & Assign::
! 500: * Converting Floats::
! 501: * Float Arithmetic::
! 502: * Float Comparison::
! 503: * I/O of Floats::
! 504: * Miscellaneous Float Functions::
! 505: @end menu
! 506:
! 507: @node Rounding Modes, Exceptions, Floating-point Functions, Floating-point Functions
! 508: @cindex Rounding modes
! 509: @section Rounding Modes
! 510:
! 511: The following four rounding modes are supported:
! 512: @itemize @bullet
! 513: @item @code{GMP_RNDN}: round to nearest
! 514: @item @code{GMP_RNDZ}: round towards zero
! 515: @item @code{GMP_RNDU}: round towards plus infinity
! 516: @item @code{GMP_RNDD}: round towards minus infinity
! 517: @end itemize
! 518: The @samp{round to nearest} mode works as in the IEEE P754 standard: in case
! 519: the number to be rounded lies exactly in the middle of two representable
! 520: numbers, it is rounded to the one with the least significant bit set to zero.
! 521: For example, the number 5, which is represented by (101) in binary, is rounded
! 522: to (100)=4 with a precision of two bits, and not to (110)=6.
! 523: This rule avoids the @dfn{drift} phenomenon mentioned by Knuth in volume 2
! 524: of The Art of Computer Programming (section 4.2.2, pages 221-222).
! 525:
! 526: Most MPFR functions take as first argument the destination variable,
! 527: as second and following arguments the input variables,
! 528: as last argument a rounding mode, and
! 529: have a return value of type @code{int}. If this value is zero, it means
! 530: that the value stored in the destination variable is the exact result of
! 531: the corresponding mathematical function. If the returned value is positive
! 532: (resp. negative), it means the value stored in the destination variable
! 533: is greater (resp. lower) than the exact result.
! 534: For example with the @code{GMP_RNDU} rounding mode, the returned value
! 535: is usually positive, except when the result is exact, in which case it is
! 536: zero.
! 537: In the case of an infinite result, it is considered as inexact when it was
! 538: obtained by overflow, and exact otherwise.
! 539: A NaN result (Not-a-Number) always corresponds to an inexact return value.
! 540:
! 541: @deftypefun void mpfr_set_default_rounding_mode (mp_rnd_t @var{rnd})
! 542: Sets the default rounding mode to @var{rnd}.
! 543: The default rounding mode is to nearest initially.
! 544: @end deftypefun
! 545:
! 546: @deftypefun int mpfr_round_prec (mpfr_t @var{x}, mp_rnd_t @var{rnd}, mp_prec_t @var{prec})
! 547: Rounds @var{x} according to @var{rnd} with precision @var{prec}, which
! 548: may be different from that of @var{x}.
! 549: If @var{prec} is greater or equal to the precision of @var{x}, then new
! 550: space is allocated for the mantissa, and it is filled with zeroes.
! 551: Otherwise, the mantissa is rounded to precision @var{prec} with the given
! 552: direction. In both cases, the precision of @var{x} is changed to @var{prec}.
! 553: The returned value is zero when the result is exact, positive when it is
! 554: greater than the original value of @var{x}, and negative when it is smaller.
! 555: The precision @var{prec} can be any integer between @code{MPFR_PREC_MIN} and
! 556: @code{MPFR_PREC_MAX}.
! 557: @end deftypefun
! 558:
! 559: @deftypefun void mpfr_set_machine_rnd_mode (mp_rnd_t @var{rnd})
! 560: Set the machine rounding mode to @var{rnd}.
! 561: This function is provided only when the operating system supports the
! 562: ISOC9X standard interface for setting rounding modes (i.e. through the
! 563: header file <fenv.h>).
! 564: @end deftypefun
! 565:
! 566: @deftypefun {char *} mpfr_print_rnd_mode (mp_rnd_t @var{rnd})
! 567: Returns the input string (GMP_RNDD, GMP_RNDU, GMP_RNDN, GMP_RNDZ)
! 568: corresponding to the rounding mode @var{rnd} or a null pointer if
! 569: @var{rnd} is an invalid rounding mode.
! 570: @end deftypefun
! 571:
! 572: @node Exceptions, Initializing Floats, Rounding Modes, Floating-point Functions
! 573: @comment node-name, next, previous, up
! 574: @section Exceptions
! 575:
! 576: Note: Overflow handling is still experimental and currently implemented
! 577: very partially. If an overflow occurs internally at the wrong place,
! 578: anything can happen (crash, wrong results, etc).
! 579:
! 580: @deftypefun mp_exp_t mpfr_get_emin (void)
! 581: @deftypefunx mp_exp_t mpfr_get_emax (void)
! 582: Return the (current) smallest and largest exponents allowed for a
! 583: floating-point variable.
! 584: @end deftypefun
! 585:
! 586: @deftypefun int mpfr_set_emin (mp_exp_t @var{exp})
! 587: @deftypefunx int mpfr_set_emax (mp_exp_t @var{exp})
! 588: Set the smallest and largest exponents allowed for a floating-point variable.
! 589: Return a non-zero value when @var{exp} is not in the range accepted by the
! 590: implementation (in that case the smallest or largest exponent is not changed),
! 591: and zero otherwise.
! 592: If the user changes the exponent range, it is her/his responsibility to check
! 593: that all current floating-point variables are in the new allowed range
! 594: (for example using @code{mpfr_check_range},
! 595: otherwise the subsequent
! 596: behaviour will be undefined, in the sense of the ISO C standard.
! 597: @end deftypefun
! 598:
! 599: @deftypefun int mpfr_check_range (mpfr_t @var{x}, mp_rnd_t @var{rnd})
! 600: Return zero if the exponent of @var{x} is in the current allowed range
! 601: (see @code{mpfr_get_emin} and @code{mpfr_get_emax}),
! 602: otherwise reset @var{x} according to the current floating-point system
! 603: and the rounding mode @var{rnd}, and return a positive value if the
! 604: rounded result is larger than the original one, a negative value otherwise
! 605: (the result cannot be exact in that case).
! 606: @end deftypefun
! 607:
! 608: @deftypefun void mpfr_clear_underflow (void)
! 609: @deftypefunx void mpfr_clear_overflow (void)
! 610: @deftypefunx void mpfr_clear_nanflag (void)
! 611: @deftypefunx void mpfr_clear_inexflag (void)
! 612: Clear the underflow, overflow, invalid, and inexact flags.
! 613: @end deftypefun
! 614:
! 615: @deftypefun void mpfr_clear_flags (void)
! 616: Clear all global flags (underflow, overflow, inexact, invalid).
! 617: @end deftypefun
! 618:
! 619: @deftypefun int mpfr_underflow_p (void)
! 620: @deftypefunx int mpfr_overflow_p (void)
! 621: @deftypefunx int mpfr_nanflag_p (void)
! 622: @deftypefunx int mpfr_inexflag_p (void)
! 623: Return the corresponding (underflow, overflow, invalid, inexact) flag,
! 624: which is non-zero iff the flag is set.
! 625: @end deftypefun
! 626:
! 627: @node Initializing Floats, Assigning Floats, Exceptions, Floating-point Functions
! 628: @comment node-name, next, previous, up
! 629: @section Initialization and Assignment Functions
! 630:
! 631: @deftypefun void mpfr_set_default_prec (mp_prec_t @var{prec})
! 632: Set the default precision to be @strong{exactly} @var{prec} bits. The
! 633: precision of a variable means the number of bits used to store its mantissa.
! 634: All
! 635: subsequent calls to @code{mpfr_init} will use this precision, but previously
! 636: initialized variables are unaffected.
! 637: This default precision is set to 53 bits initially.
! 638: The precision can be any integer between @code{MPFR_PREC_MIN} and
! 639: @code{MPFR_PREC_MAX}.
! 640: @end deftypefun
! 641:
! 642: @deftypefun mp_prec_t mpfr_get_default_prec ()
! 643: Returns the default MPFR precision in bits.
! 644: @end deftypefun
! 645:
! 646: An @code{mpfr_t} object must be initialized before storing the first value in
! 647: it. The functions @code{mpfr_init} and @code{mpfr_init2} are used for that
! 648: purpose.
! 649:
! 650: @deftypefun void mpfr_init (mpfr_t @var{x})
! 651: Initialize @var{x}, and set its value to NaN.
! 652: Normally, a variable should be initialized once only
! 653: or at least be cleared, using @code{mpfr_clear}, between initializations. The
! 654: precision of @var{x} is the default precision, which can be changed
! 655: by a call to @code{mpfr_set_default_prec}.
! 656: @end deftypefun
! 657:
! 658: @deftypefun void mpfr_init2 (mpfr_t @var{x}, mp_prec_t @var{prec})
! 659: Initialize @var{x}, set its precision to be @strong{exactly}
! 660: @var{prec} bits, and set its value to NaN.
! 661: Normally, a variable should be initialized once only or at
! 662: least be cleared, using @code{mpfr_clear}, between initializations.
! 663: To change the precision of a variable which has already been initialized,
! 664: use @code{mpfr_set_prec} instead.
! 665: The precision @var{prec} can be any integer between @code{MPFR_PREC_MIN} and
! 666: @code{MPFR_PREC_MAX}.
! 667: @end deftypefun
! 668:
! 669: @deftypefun void mpfr_clear (mpfr_t @var{x})
! 670: Free the space occupied by @var{x}. Make sure to call this function for all
! 671: @code{mpfr_t} variables when you are done with them.
! 672: @end deftypefun
! 673:
! 674: @need 2000
! 675: Here is an example on how to initialize floating-point variables:
! 676: @example
! 677: @{
! 678: mpfr_t x, y;
! 679: mpfr_init (x); /* use default precision */
! 680: mpfr_init2 (y, 256); /* precision @emph{exactly} 256 bits */
! 681: @dots{}
! 682: /* Unless the program is about to exit, do ... */
! 683: mpfr_clear (x);
! 684: mpfr_clear (y);
! 685: @}
! 686: @end example
! 687:
! 688: The following two functions are useful for changing the precision during a
! 689: calculation. A typical use would be for adjusting the precision gradually in
! 690: iterative algorithms like Newton-Raphson, making the computation precision
! 691: closely match the actual accurate part of the numbers.
! 692:
! 693: @deftypefun int mpfr_set_prec (mpfr_t @var{x}, mp_prec_t @var{prec})
! 694: Reset the precision of @var{x} to be @strong{exactly} @var{prec} bits.
! 695: The previous value stored in @var{x} is lost. It is equivalent to
! 696: a call to @code{mpfr_clear(x)} followed by a call to
! 697: @code{mpfr_init2(x, prec)}, but more efficient as no allocation is done in
! 698: case the current allocated space for the mantissa of @var{x} is enough.
! 699: The precision @var{prec} can be any integer between @code{MPFR_PREC_MIN} and
! 700: @code{MPFR_PREC_MAX}.
! 701: It returns a non-zero value iff the memory allocation failed.
! 702:
! 703: In case you want to keep the previous value stored in @var{x},
! 704: use @code{mpfr_round_prec} instead.
! 705: @end deftypefun
! 706:
! 707: @deftypefun mp_prec_t mpfr_get_prec (mpfr_t @var{x})
! 708: Return the precision actually used for assignments of @var{x}, i.e.
! 709: the number of bits used to store its mantissa.
! 710: @end deftypefun
! 711:
! 712: @deftypefun void mpfr_set_prec_raw (mpfr_t @var{x}, unsigned long int @var{p})
! 713: Reset the precision of @var{x} to be @strong{exactly} @var{prec} bits.
! 714: The only difference with @code{mpfr_set_prec} is that @var{p} is assumed to
! 715: be small enough so that the mantissa fits into the current allocated memory
! 716: space for @var{x}. Otherwise an error will occur.
! 717: @end deftypefun
! 718:
! 719: @node Assigning Floats, Simultaneous Float Init & Assign, Initializing Floats, Floating-point Functions
! 720: @comment node-name, next, previous, up
! 721: @section Assignment Functions
! 722: @cindex Float assignment functions
! 723:
! 724: These functions assign new values to already initialized floats
! 725: (@pxref{Initializing Floats}).
! 726:
! 727: @deftypefun int mpfr_set (mpfr_t @var{rop}, mpfr_t @var{op}, mp_rnd_t @var{rnd})
! 728: @deftypefunx int mpfr_set_ui (mpfr_t @var{rop}, unsigned long int @var{op}, mp_rnd_t @var{rnd})
! 729: @deftypefunx int mpfr_set_si (mpfr_t @var{rop}, long int @var{op}, mp_rnd_t @var{rnd}
! 730: @deftypefunx int mpfr_set_d (mpfr_t @var{rop}, double @var{op}, mp_rnd_t @var{rnd})
! 731: @deftypefunx int mpfr_set_z (mpfr_t @var{rop}, mpz_t @var{op}, mp_rnd_t @var{rnd})
! 732: @deftypefunx int mpfr_set_q (mpfr_t @var{rop}, mpq_t @var{op}, mp_rnd_t @var{rnd})
! 733: Set the value of @var{rop} from @var{op}, rounded to the precision of @var{rop}
! 734: towards the given direction @var{rnd}.
! 735: Please note that even a @code{long int} may have to be rounded,
! 736: if the destination precision is less than the machine word width.
! 737: The return value is zero when @var{rop}=@var{op}, positive when
! 738: @var{rop}>@var{op},
! 739: and negative when @var{rop}<@var{op}.
! 740: For @code{mpfr_set_d}, be careful that the input number @var{op}
! 741: may not be exactly representable as a double-precision number (this happens for
! 742: 0.1 for instance), in which case it is first
! 743: rounded by the C compiler to a double-precision number, and then only
! 744: to a mpfr floating-point number.
! 745: @end deftypefun
! 746:
! 747: @deftypefun int mpfr_set_str (mpfr_t @var{x}, char *@var{s}, int @var{base}, mp_rnd_t @var{rnd})
! 748: Set @var{x} to the value of the string @var{s} in base @var{base} (between
! 749: 2 and 36), rounded in direction @var{rnd} to the precision of @var{x}.
! 750: The exponent is read in decimal.
! 751: This function returns @minus{}1 if an internal overflow occurred (for
! 752: instance, because the exponent is too large). Otherwise it returns 0
! 753: if the base is valid and if the entire string up to the final '\0' is
! 754: a valid number in base @var{base}, and 1 if the input is incorrect.
! 755: @end deftypefun
! 756:
! 757: @deftypefun void mpfr_set_str_raw (mpfr_t @var{x}, char *@var{s})
! 758: Set @var{x} to the value of the binary number in string @var{s}, which has to
! 759: be of the
! 760: form +/-xxxx.xxxxxxEyy. The exponent is read in decimal, but is interpreted
! 761: as the power of two to be multiplied by the mantissa.
! 762: The mantissa length of @var{s} has to be less or equal to the precision of
! 763: @var{x}, otherwise an error occurs.
! 764: If @var{s} starts with @code{N}, it is interpreted as NaN (Not-a-Number);
! 765: if it starts with @code{I} after the sign, it is interpreted as infinity,
! 766: with the corresponding sign.
! 767: @end deftypefun
! 768:
! 769: @deftypefun int mpfr_set_f (mpfr_t @var{x}, mpf_t @var{y}, mp_rnd_t @var{rnd})
! 770: Set @var{x} to the GNU MP floating-point number
! 771: @var{y}, rounded with the @var{rnd} mode and the precision
! 772: of @var{x}.
! 773: The returned value is zero when @var{x}=@var{y}, positive when @var{x}>@var{y},
! 774: and negative when @var{x}<@var{y}.
! 775: @end deftypefun
! 776:
! 777: @deftypefun void mpfr_set_inf (mpfr_t @var{x}, int @var{sign})
! 778: @deftypefunx void mpfr_set_nan (mpfr_t @var{x})
! 779: Set the variable @var{x} to infinity or NaN (Not-a-Number) respectively.
! 780: In @code{mpfr_set_inf}, @var{x} is set to plus infinity iff @var{sign} is
! 781: positive.
! 782: @end deftypefun
! 783:
! 784: @deftypefun void mpfr_swap (mpfr_t @var{x}, mpfr_t @var{y})
! 785: Swap the values @var{x} and @var{y} efficiently. Warning: the
! 786: precisions are exchanged too; in case the precisions are different,
! 787: @code{mpfr_swap} is thus not equivalent to three @code{mpfr_set} calls
! 788: using a third auxiliary variable.
! 789: @end deftypefun
! 790:
! 791: @node Simultaneous Float Init & Assign, Converting Floats, Assigning Floats, Floating-point Functions
! 792: @comment node-name, next, previous, up
! 793: @section Combined Initialization and Assignment Functions
! 794: @cindex Initialization and assignment functions
! 795:
! 796: @deftypefn Macro int mpfr_init_set (mpfr_t @var{rop}, mpfr_t @var{op}, mp_rnd_t @var{rnd})
! 797: @deftypefnx Macro int mpfr_init_set_ui (mpfr_t @var{rop}, unsigned long int @var{op}, mp_rnd_t @var{rnd})
! 798: @deftypefnx Macro int mpfr_init_set_si (mpfr_t @var{rop}, signed long int @var{op}, mp_rnd_t @var{rnd})
! 799: @deftypefnx Macro int mpfr_init_set_d (mpfr_t @var{rop}, double @var{op}, mp_rnd_t @var{rnd})
! 800: @deftypefnx Macro int mpfr_init_set_f (mpfr_t @var{rop}, mpf_t @var{op}, mp_rnd_t @var{rnd})
! 801: @deftypefnx Macro int mpfr_init_set_z (mpfr_t @var{rop}, mpz_t @var{op}, mp_rnd_t @var{rnd})
! 802: @deftypefnx Macro int mpfr_init_set_q (mpfr_t @var{rop}, mpq_t @var{op}, mp_rnd_t @var{rnd})
! 803: Initialize @var{rop} and set its value from @var{op}, rounded to direction
! 804: @var{rnd}.
! 805: The precision of @var{rop} will be taken from the active default precision,
! 806: as set by @code{mpfr_set_default_prec}.
! 807: The return value if zero if @var{rop}=@var{op}, positive if @var{rop}>@var{op},
! 808: and negative when @var{rop}<@var{op}.
! 809: @end deftypefn
! 810:
! 811: @deftypefun int mpfr_init_set_str (mpfr_t @var{x}, char *@var{s}, int @var{base}, mp_rnd_t @var{rnd})
! 812: Initialize @var{x} and set its value from
! 813: the string @var{s} in base @var{base},
! 814: rounded to direction @var{rnd}.
! 815: See @code{mpfr_set_str}.
! 816: @end deftypefun
! 817:
! 818: @node Converting Floats, Float Arithmetic, Simultaneous Float Init & Assign, Floating-point Functions
! 819: @comment node-name, next, previous, up
! 820: @section Conversion Functions
! 821: @cindex Conversion functions
! 822:
! 823: @deftypefun double mpfr_get_d (mpfr_t @var{op}, mp_rnd_t @var{rnd})
! 824: Convert @var{op} to a double, using the rounding mode @var{rnd}.
! 825: @end deftypefun
! 826:
! 827: @deftypefun double mpfr_get_d1 (mpfr_t @var{op})
! 828: Convert @var{op} to a double, using the default MPFR rounding mode
! 829: (see function @code{mpfr_set_default_rounding_mode}).
! 830: @end deftypefun
! 831:
! 832: @deftypefun mp_exp_t mpfr_get_z_exp (mpz_t @var{z}, mpfr_t @var{op})
! 833: Puts the mantissa of @var{op} into @var{z}, and returns the exponent
! 834: @var{exp} such that @var{op} equals @var{z} multiplied by two exponent
! 835: @var{exp}.
! 836: @end deftypefun
! 837:
! 838: @deftypefun {char *} mpfr_get_str (char *@var{str}, mp_exp_t *@var{expptr}, int @var{base}, size_t @var{n_digits}, mpfr_t @var{op}, mp_rnd_t @var{rnd})
! 839: Convert @var{op} to a string of digits in base @var{base}, with rounding in
! 840: direction @var{rnd}. The base may vary
! 841: from 2 to 36. Generate exactly @var{n_digits} significant digits.
! 842:
! 843: If @var{n_digits} is 0, it writes the maximum possible number of digits
! 844: giving an exact rounding in the given base @var{base} with the direction
! 845: @var{rnd}. In other words, if @var{op} was the exact rounding
! 846: of a real number in direction @var{rnd}, then the written value is also
! 847: an exact rounding in base @var{base} of that real number with the same
! 848: precision. An error occurs when one is unable to determine the leading
! 849: digit, which can happen especially if the precision of @var{op} is small.
! 850:
! 851: If @var{str} is a null pointer, space for the mantissa is allocated using
! 852: the default allocation function, and a pointer to the string is returned.
! 853: In that case, the user should her/himself free the corresponding memory
! 854: with @code{(*_mp_free_func)(s, strlen(s) + 1)}.
! 855:
! 856: If @var{str} is not a null pointer, it should point to a block of storage
! 857: large enough for the mantissa, i.e., @var{n_digits} + 2 or more. The extra
! 858: two bytes are for a possible minus sign, and for the terminating null
! 859: character.
! 860:
! 861: If the input number is a real number, the exponent is written through
! 862: the pointer @var{expptr} (the current minimal exponent for 0).
! 863:
! 864: If @var{n_digits} is 0, note that the space requirements for @var{str}
! 865: in this case will be impossible for the user to predetermine. Therefore,
! 866: one needs to pass a null pointer for the string argument whenever
! 867: @var{n_digits} is 0.
! 868:
! 869: The generated string is a fraction, with an implicit radix point immediately
! 870: to the left of the first digit. For example, the number 3.1416 would be
! 871: returned as "31416" in the string and 1 written at @var{expptr}.
! 872:
! 873: A pointer to the string is returned, unless there is an error, in which
! 874: case a null pointer is returned.
! 875: @end deftypefun
! 876:
! 877:
! 878: @node Float Arithmetic, Float Comparison, Converting Floats, Floating-point Functions
! 879: @comment node-name, next, previous, up
! 880: @section Basic Arithmetic Functions
! 881: @cindex Float arithmetic functions
! 882: @cindex Arithmetic functions
! 883:
! 884: @deftypefun int mpfr_add (mpfr_t @var{rop}, mpfr_t @var{op1}, mpfr_t @var{op2}, mp_rnd_t @var{rnd})
! 885: @deftypefunx int mpfr_add_ui (mpfr_t @var{rop}, mpfr_t @var{op1}, unsigned long int @var{op2}, mp_rnd_t @var{rnd})
! 886: @deftypefunx int mpfr_add_z (mpfr_t @var{rop}, mpfr_t @var{op1}, mpz_t @var{op2}, mp_rnd_t @var{rnd})
! 887: @deftypefunx int mpfr_add_q (mpfr_t @var{rop}, mpfr_t @var{op1}, mpq_t @var{op2}, mp_rnd_t @var{rnd})
! 888: Set @var{rop} to @var{op1} @math{+} @var{op2} rounded in the direction @var{rnd}.
! 889: The return value is zero if @var{rop} is exactly @var{op1} @math{+} @var{op2},
! 890: positive if @var{rop} is larger than @var{op1} @math{+} @var{op2},
! 891: and negative if @var{rop} is smaller than @var{op1} @math{+} @var{op2}.
! 892: @end deftypefun
! 893:
! 894: @deftypefun int mpfr_sub (mpfr_t @var{rop}, mpfr_t @var{op1}, mpfr_t @var{op2}, mp_rnd_t @var{rnd})
! 895: @deftypefunx int mpfr_ui_sub (mpfr_t @var{rop}, unsigned long int @var{op1}, mpfr_t @var{op2}, mp_rnd_t @var{rnd})
! 896: @deftypefunx int mpfr_sub_ui (mpfr_t @var{rop}, mpfr_t @var{op1}, unsigned long int @var{op2}, mp_rnd_t @var{rnd})
! 897: @deftypefunx int mpfr_sub_z (mpfr_t @var{rop}, mpfr_t @var{op1}, mpz_t @var{op2}, mp_rnd_t @var{rnd})
! 898: @deftypefunx int mpfr_sub_q (mpfr_t @var{rop}, mpfr_t @var{op1}, mpq_t @var{op2}, mp_rnd_t @var{rnd})
! 899: Set @var{rop} to @var{op1} @minus{} @var{op2} rounded in the direction @var{rnd}.
! 900: The return value is zero if @var{rop} is exactly @var{op1} @minus{} @var{op2},
! 901: positive if @var{rop} is larger than @var{op1} @minus{} @var{op2},
! 902: and negative if @var{rop} is smaller than @var{op1} @minus{} @var{op2}.
! 903: @end deftypefun
! 904:
! 905: @deftypefun int mpfr_mul (mpfr_t @var{rop}, mpfr_t @var{op1}, mpfr_t @var{op2}, mp_rnd_t @var{rnd})
! 906: @deftypefunx int mpfr_mul_ui (mpfr_t @var{rop}, mpfr_t @var{op1}, unsigned long int @var{op2}, mp_rnd_t @var{rnd})
! 907: @deftypefunx int mpfr_mul_z (mpfr_t @var{rop}, mpfr_t @var{op1}, mpz_t @var{op2}, mp_rnd_t @var{rnd})
! 908: @deftypefunx int mpfr_mul_q (mpfr_t @var{rop}, mpfr_t @var{op1}, mpq_t @var{op2}, mp_rnd_t @var{rnd})
! 909: @ifinfo
! 910: Set @var{rop} to @var{op1} times @var{op2} rounded in the direction @var{rnd}.
! 911: Return 0 if the result is exact, a positive value if
! 912: @var{rop}>@var{op1}*@var{op2}, a negative value otherwise.
! 913: @end ifinfo
! 914: @tex
! 915: Set @var{rop} to $@var{op1} \times @var{op2}$ rounded in the direction @var{rnd}.
! 916: Return 0 if the result is exact, a positive value if
! 917: $@var{rop} > @var{op1} \times @var{op2}$, a negative value otherwise.
! 918: @end tex
! 919: @end deftypefun
! 920:
! 921: @deftypefun int mpfr_div (mpfr_t @var{rop}, mpfr_t @var{op1}, mpfr_t @var{op2}, mp_rnd_t @var{rnd})
! 922: @deftypefunx int mpfr_ui_div (mpfr_t @var{rop}, unsigned long int @var{op1}, mpfr_t @var{op2}, mp_rnd_t @var{rnd})
! 923: @deftypefunx int mpfr_div_ui (mpfr_t @var{rop}, mpfr_t @var{op1}, unsigned long int @var{op2}, mp_rnd_t @var{rnd})
! 924: @deftypefunx int mpfr_div_z (mpfr_t @var{rop}, mpfr_t @var{op1}, mpz_t @var{op2}, mp_rnd_t @var{rnd})
! 925: @deftypefunx int mpfr_div_q (mpfr_t @var{rop}, mpfr_t @var{op1}, mpq_t @var{op2}, mp_rnd_t @var{rnd})
! 926: Set @var{rop} to @var{op1}/@var{op2} rounded in the direction @var{rnd}.
! 927: These functions return 0 if the division is exact,
! 928: a positive value when @var{rop} is larger than @var{op1} divided by @var{op2},
! 929: and a negative value otherwise.
! 930: @end deftypefun
! 931:
! 932: @deftypefun int mpfr_sqrt (mpfr_t @var{rop}, mpfr_t @var{op}, mp_rnd_t @var{rnd})
! 933: @deftypefunx int mpfr_sqrt_ui (mpfr_t @var{rop}, unsigned long int @var{op}, mp_rnd_t @var{rnd})
! 934: @ifinfo
! 935: Set @var{rop} to the square root of @var{op} rounded in the direction @var{rnd}.
! 936: @end ifinfo
! 937: @tex
! 938: Set @var{rop} to $\sqrt{@var{op}}$ rounded in the direction @var{rnd}.
! 939: @end tex
! 940: Set @var{rop} to NaN if @var{op} is negative.
! 941: Return 0 if the operation is exact, a non-zero value otherwise.
! 942: @end deftypefun
! 943:
! 944: @deftypefun int mpfr_pow_ui (mpfr_t @var{rop}, mpfr_t @var{op1}, unsigned long int @var{op2}, mp_rnd_t @var{rnd})
! 945: @deftypefunx int mpfr_ui_pow_ui (mpfr_t @var{rop}, unsigned long int @var{op1}, unsigned long int @var{op2}, mp_rnd_t @var{rnd})
! 946: Set @var{rop} to @var{op1} raised to @var{op2}. The computation is done by
! 947: binary exponentiation.
! 948: Return 0 if the result is exact, a non-zero value otherwise (but the sign
! 949: of the return value has no meaning).
! 950: @end deftypefun
! 951:
! 952: @deftypefun int mpfr_ui_pow (mpfr_t @var{rop}, unsigned long int @var{op1}, mpfr_t @var{op2}, mp_rnd_t @var{rnd})
! 953: Set @var{rop} to @var{op1} raised to @var{op2},
! 954: rounded to the direction @var{rnd} with the precision of @var{rop}.
! 955: Return zero iff the result is exact, a positive value when the
! 956: result is greater than @var{op1} to the power @var{op2}, and a negative value
! 957: when it is smaller.
! 958: @end deftypefun
! 959:
! 960: @deftypefun int mpfr_pow_si (mpfr_t @var{rop}, mpfr_t @var{op1}, long int @var{op2}, mp_rnd_t @var{rnd})
! 961: Set @var{rop} to @var{op1} raised to the power @var{op2},
! 962: rounded to the direction @var{rnd} with the
! 963: precision of @var{rop}.
! 964: Return zero iff the result is exact.
! 965: @end deftypefun
! 966:
! 967: @deftypefun int mpfr_pow (mpfr_t @var{rop}, mpfr_t @var{op1}, mpfr_t @var{op2}, mp_rnd_t @var{rnd})
! 968: Set @var{rop} to @var{op1} raised to the power @var{op2},
! 969: rounded to the direction @var{rnd} with the precision of @var{rop}.
! 970: If @var{op1} is negative then @var{rop} is set to NaN,
! 971: even if @var{op2} is an integer.
! 972: Return zero iff the result is exact.
! 973: @end deftypefun
! 974:
! 975: @deftypefun int mpfr_neg (mpfr_t @var{rop}, mpfr_t @var{op}, mp_rnd_t @var{rnd})
! 976: Set @var{rop} to @minus{}@var{op} rounded in the direction @var{rnd}.
! 977: Just changes the sign
! 978: if @var{rop} and @var{op} are the same variable.
! 979: @end deftypefun
! 980:
! 981: @deftypefun int mpfr_abs (mpfr_t @var{rop}, mpfr_t @var{op}, mp_rnd_t @var{rnd})
! 982: Set @var{rop} to the absolute value of @var{op},
! 983: rounded in the direction @var{rnd}.
! 984: Return 0 if the result is exact, a positive value if @var{rop} is larger than
! 985: the absolute value of @var{op}, and a negative value otherwise.
! 986: @end deftypefun
! 987:
! 988: @deftypefun int mpfr_mul_2exp (mpfr_t @var{rop}, mpfr_t @var{op1}, unsigned long int @var{op2}, mp_rnd_t @var{rnd})
! 989: @deftypefunx int mpfr_mul_2ui (mpfr_t @var{rop}, mpfr_t @var{op1}, unsigned long int @var{op2}, mp_rnd_t @var{rnd})
! 990: @deftypefunx int mpfr_mul_2si (mpfr_t @var{rop}, mpfr_t @var{op1}, long int @var{op2}, mp_rnd_t @var{rnd})
! 991: @ifinfo
! 992: Set @var{rop} to @var{op1} times 2 raised to @var{op2}
! 993: @end ifinfo
! 994: @tex
! 995: Set @var{rop} to $@var{op1} \times 2^{op2}$
! 996: @end tex
! 997: rounded to the direction @var{rnd}. Just increases the exponent by @var{op2}
! 998: when @var{rop} and @var{op1} are identical.
! 999: Return zero when @var{rop}=@var{op1}, a positive value when @var{rop}>@var{op1},
! 1000: and a negative value when @var{rop}<@var{op1}.
! 1001: Note: The @code{mpfr_mul_2exp} function is defined for compatibility reasons;
! 1002: you should use @code{mpfr_mul_2ui} (or @code{mpfr_mul_2si}) instead.
! 1003: @end deftypefun
! 1004:
! 1005: @deftypefun int mpfr_div_2exp (mpfr_t @var{rop}, mpfr_t @var{op1}, unsigned long int @var{op2}, mp_rnd_t @var{rnd})
! 1006: @deftypefunx int mpfr_div_2ui (mpfr_t @var{rop}, mpfr_t @var{op1}, unsigned long int @var{op2}, mp_rnd_t @var{rnd})
! 1007: @deftypefunx int mpfr_div_2si (mpfr_t @var{rop}, mpfr_t @var{op1}, long int @var{op2}, mp_rnd_t @var{rnd})
! 1008: @ifinfo
! 1009: Set @var{rop} to @var{op1} divided by 2 raised to @var{op2}
! 1010: @end ifinfo
! 1011: @tex
! 1012: Set @var{rop} to $@var{op1}/2^{op2}$
! 1013: @end tex
! 1014: rounded to the direction @var{rnd}. Just decreases the exponent by @var{op2}
! 1015: when @var{rop} and @var{op1} are identical.
! 1016: Return zero when @var{rop}=@var{op1}, a positive value when @var{rop}>@var{op1},
! 1017: and a negative value when @var{rop}<@var{op1}.
! 1018: Note: The @code{mpfr_div_2exp} function is defined for compatibility reasons;
! 1019: you should use @code{mpfr_div_2ui} (or @code{mpfr_div_2si}) instead.
! 1020: @end deftypefun
! 1021:
! 1022: @node Float Comparison, I/O of Floats, Float Arithmetic, Floating-point Functions
! 1023: @comment node-name, next, previous, up
! 1024: @section Comparison Functions
! 1025: @cindex Float comparisons functions
! 1026: @cindex Comparison functions
! 1027:
! 1028: @deftypefun int mpfr_cmp (mpfr_t @var{op1}, mpfr_t @var{op2})
! 1029: @deftypefunx int mpfr_cmp_ui (mpfr_t @var{op1}, unsigned long int @var{op2})
! 1030: @deftypefunx int mpfr_cmp_si (mpfr_t @var{op1}, signed long int @var{op2})
! 1031: @ifinfo
! 1032: Compare @var{op1} and @var{op2}. Return a positive value if @var{op1} >
! 1033: @var{op2}, zero if @var{op1} = @var{op2}, and a negative value if @var{op1} <
! 1034: @var{op2}.
! 1035: @end ifinfo
! 1036: @tex
! 1037: Compare @var{op1} and @var{op2}. Return a positive value if $@var{op1} >
! 1038: @var{op2}$, zero if $@var{op1} = @var{op2}$, and a negative value if $@var{op1}
! 1039: < @var{op2}$.
! 1040: @end tex
! 1041: Both @var{op1} and @var{op2} are considered to their full own precision,
! 1042: which may differ. In case @var{op1} and @var{op2} are of same sign but
! 1043: different, the absolute value returned is
! 1044: one plus the absolute difference of their exponents.
! 1045: It is not allowed that one of the operands is NaN (Not-a-Number).
! 1046: @end deftypefun
! 1047:
! 1048: @deftypefun int mpfr_cmp_ui_2exp (mpfr_t @var{op1}, unsigned long int @var{op2}, int @var{e})
! 1049: @deftypefunx int mpfr_cmp_si_2exp (mpfr_t @var{op1}, long int @var{op2}, int @var{e})
! 1050: Compare @var{op1} and @var{op2} multiplied by two to the power @var{e}.
! 1051: @end deftypefun
! 1052:
! 1053: @deftypefun int mpfr_eq (mpfr_t @var{op1}, mpfr_t @var{op2}, unsigned long int op3)
! 1054: Return non-zero if the first @var{op3} bits of @var{op1} and @var{op2} are
! 1055: equal, zero otherwise. I.e., tests if @var{op1} and @var{op2} are
! 1056: approximately equal.
! 1057: @end deftypefun
! 1058:
! 1059: @deftypefun int mpfr_nan_p (mpfr_t @var{op})
! 1060: Return non-zero if @var{op} is Not-a-Number (NaN), zero otherwise.
! 1061: @end deftypefun
! 1062:
! 1063: @deftypefun int mpfr_inf_p (mpfr_t @var{op})
! 1064: Return non-zero if @var{op} is plus or minus infinity, zero otherwise.
! 1065: @end deftypefun
! 1066:
! 1067: @deftypefun int mpfr_number_p (mpfr_t @var{op})
! 1068: Return non-zero if @var{op} is an ordinary number, i.e. neither Not-a-Number
! 1069: nor plus or minus infinity.
! 1070: @end deftypefun
! 1071:
! 1072: @deftypefun void mpfr_reldiff (mpfr_t @var{rop}, mpfr_t @var{op1}, mpfr_t @var{op2}, mp_rnd_t @var{rnd})
! 1073: Compute the relative difference between @var{op1} and @var{op2}
! 1074: and store the result in @var{rop}.
! 1075: This function does not guarantee the exact rounding on the relative difference;
! 1076: it just computes abs(@var{op1}@minus{}@var{op2})/@var{op1}, using the
! 1077: rounding mode @var{rnd} for all operations.
! 1078: @end deftypefun
! 1079:
! 1080: @deftypefun int mpfr_sgn (mpfr_t @var{op})
! 1081: Return a positive value if @var{op} > 0, zero if @var{op} = 0,
! 1082: and a negative value if @var{op} < 0.
! 1083: Its result is not specified when @var{op} is NaN (Not-a-Number).
! 1084: @end deftypefun
! 1085:
! 1086: @section Special Functions
! 1087: @cindex Special functions
! 1088:
! 1089: @deftypefun int mpfr_log (mpfr_t @var{rop}, mpfr_t @var{op}, mp_rnd_t @var{rnd})
! 1090: Set @var{rop} to the natural logarithm of @var{op},
! 1091: rounded to the direction @var{rnd} with the precision of @var{rop}.
! 1092: Return zero when the result is exact
! 1093: (this occurs in fact only when @var{op} is 0, 1, or +infinity)
! 1094: and a non-zero value otherwise (except for rounding to nearest,
! 1095: the sign of the return value is that of @var{rop}-log(@var{op}).
! 1096: @end deftypefun
! 1097:
! 1098: @deftypefun int mpfr_exp (mpfr_t @var{rop}, mpfr_t @var{op}, mp_rnd_t @var{rnd})
! 1099: Set @var{rop} to the exponential of @var{op},
! 1100: rounded to the direction @var{rnd} with the precision of @var{rop}.
! 1101: Return zero when the result is exact
! 1102: (this occurs in fact only when @var{op} is -infinity, 0, or +infinity),
! 1103: a positive value when the result is greater than the exponential of @var{op},
! 1104: and a negative value when it is smaller.
! 1105: @end deftypefun
! 1106:
! 1107: @deftypefun int mpfr_exp2 (mpfr_t @var{rop}, mpfr_t @var{op}, mp_rnd_t @var{rnd})
! 1108: Set @var{rop} to 2 power of @var{op},
! 1109: rounded to the direction @var{rnd} with the precision of @var{rop}.
! 1110: Return zero iff the result is exact (this occurs in fact only when @var{op}
! 1111: is -infinity, 0, or +infinity),
! 1112: a positive value when the result is greater than the exponential of @var{op},
! 1113: and a negative value when it is smaller.
! 1114: @end deftypefun
! 1115:
! 1116: @deftypefun int mpfr_cos (mpfr_t @var{cop}, mpfr_t @var{op}, mp_rnd_t @var{rnd})
! 1117: @deftypefunx int mpfr_sin (mpfr_t @var{sop}, mpfr_t @var{op}, mp_rnd_t @var{rnd})
! 1118: @deftypefunx int mpfr_tan (mpfr_t @var{top}, mpfr_t @var{op}, mp_rnd_t @var{rnd})
! 1119: Set @var{cop} to the cosine of @var{op}, @var{sop} to the sine of @var{op},
! 1120: @var{top} to the tangent of @var{op}, rounded to the direction @var{rnd} with
! 1121: the precision of @var{rop}. Return 0 iff the result is exact (this occurs
! 1122: in fact only when @var{op} is 0 i.e. the sine is 0, the cosine is 1, and the
! 1123: tangent is 0).
! 1124: @end deftypefun
! 1125:
! 1126: @deftypefun int mpfr_sin_cos (mpfr_t @var{sop}, mpfr_t @var{cop}, mpfr_t @var{op}, mp_rnd_t @var{rnd})
! 1127: Set simultaneously @var{sop} to the sine of @var{op} and
! 1128: @var{cop} to the cosine of @var{op},
! 1129: rounded to the direction @var{rnd} with their corresponding precisions.
! 1130: Return 0 iff both results are exact.
! 1131: @end deftypefun
! 1132:
! 1133: @deftypefun int mpfr_acos (mpfr_t @var{rop}, mpfr_t @var{op}, mp_rnd_t @var{rnd})
! 1134: @deftypefunx int mpfr_asin (mpfr_t @var{rop}, mpfr_t @var{op}, mp_rnd_t @var{rnd})
! 1135: @deftypefunx int mpfr_atan (mpfr_t @var{rop}, mpfr_t @var{op}, mp_rnd_t @var{rnd})
! 1136: Set @var{rop} to the arc-cosine, arc-sine or arc-tangent of @var{op},
! 1137: rounded to the direction @var{rnd} with the precision of @var{rop}.
! 1138: Return 0 iff the result is exact.
! 1139: @end deftypefun
! 1140:
! 1141: @deftypefun int mpfr_cosh (mpfr_t @var{cop}, mpfr_t @var{op}, mp_rnd_t @var{rnd})
! 1142: @deftypefunx int mpfr_sinh (mpfr_t @var{sop}, mpfr_t @var{op}, mp_rnd_t @var{rnd})
! 1143: @deftypefunx int mpfr_tanh (mpfr_t @var{top}, mpfr_t @var{op}, mp_rnd_t @var{rnd})
! 1144: Set @var{cop} to the hyperbolic cosine of @var{op},
! 1145: @var{sop} to the hyperbolic sine of @var{op},
! 1146: @var{top} to the hyperbolic tangent of @var{op},
! 1147: rounded to the direction @var{rnd} with the precision of @var{rop}.
! 1148: Return 0 iff the result is exact (this occurs in fact only when @var{op} is 0
! 1149: i.e. the result is 1).
! 1150: @end deftypefun
! 1151:
! 1152: @deftypefun int mpfr_acosh (mpfr_t @var{rop}, mpfr_t @var{op}, mp_rnd_t @var{rnd})
! 1153: @deftypefunx int mpfr_asinh (mpfr_t @var{rop}, mpfr_t @var{op}, mp_rnd_t @var{rnd})
! 1154: @deftypefunx int mpfr_atanh (mpfr_t @var{rop}, mpfr_t @var{op}, mp_rnd_t @var{rnd})
! 1155: Set @var{rop} to the inverse hyperbolic cosine, sine or tangent of @var{op},
! 1156: rounded to the direction @var{rnd} with the precision of @var{rop}.
! 1157: Return 0 iff the result is exact.
! 1158: @end deftypefun
! 1159:
! 1160: @deftypefun int mpfr_fac_ui (mpfr_t @var{rop}, unsigned long int @var{op}, mp_rnd_t @var{rnd})
! 1161: Set @var{rop} to the factorial of the unsigned long int @var{op},
! 1162: rounded to the direction @var{rnd} with the precision of @var{rop}.
! 1163: Return 0 iff the result is exact.
! 1164: @end deftypefun
! 1165:
! 1166: @deftypefun int mpfr_log1p (mpfr_t @var{rop}, mpfr_t @var{op}, mp_rnd_t @var{rnd})
! 1167: Set @var{rop} to the logarithm of one plus @var{op},
! 1168: rounded to the direction @var{rnd} with the precision of @var{rop}.
! 1169: Return 0 iff the result is exact (this occurs in fact only when @var{op} is 0
! 1170: i.e. the result is 0).
! 1171: @end deftypefun
! 1172:
! 1173: @deftypefun int mpfr_expm1 (mpfr_t @var{rop}, mpfr_t @var{op}, mp_rnd_t @var{rnd})
! 1174: Set @var{rop} to the exponential of @var{op} minus one,
! 1175: rounded to the direction @var{rnd} with the precision of @var{rop}.
! 1176: Return 0 iff the result is exact (this occurs in fact only when @var{op} is 0
! 1177: i.e. the result is 0).
! 1178: @end deftypefun
! 1179:
! 1180: @deftypefun int mpfr_log2 (mpfr_t @var{rop}, mpfr_t @var{op}, mp_rnd_t @var{rnd})
! 1181: @deftypefunx int mpfr_log10 (mpfr_t @var{rop}, mpfr_t @var{op}, mp_rnd_t @var{rnd})
! 1182: Set @var{rop} to the log[t] (t=2 or 10)(log x / log t) of @var{op}, rounded to the direction @var{rnd} with the precision of @var{rop}. Return 0 iff the result is exact (this occurs in fact only when @var{op} is 1 i.e. the result is 0).
! 1183: @end deftypefun
! 1184:
! 1185: @deftypefun int mpfr_fma (mpfr_t @var{rop}, mpfr_t @var{opx},mpfr_t @var{opy},mpfr_t @var{opz}, mp_rnd_t @var{rnd})
! 1186: Set @var{rop} to @var{opx} * @var{opy} + @var{opz}, rounded to the direction
! 1187: @var{rnd} with the precision of @var{rop}. Return 0 iff the result is exact,
! 1188: a positive value if @var{rop} is larger than @var{opx} * @var{opy} + @var{opz},
! 1189: and a negative value otherwise.
! 1190: @end deftypefun
! 1191:
! 1192: @deftypefun void mpfr_agm (mpfr_t @var{rop}, mpfr_t @var{op1}, mpfr_t @var{op2}, mp_rnd_t @var{rnd})
! 1193: Set @var{rop} to the arithmetic-geometric mean of @var{op1} and @var{op2},
! 1194: rounded to the direction @var{rnd} with the precision of @var{rop}.
! 1195: @end deftypefun
! 1196:
! 1197: @deftypefun void mpfr_const_log2 (mpfr_t @var{rop}, mp_rnd_t @var{rnd})
! 1198: Set @var{rop} to the logarithm of 2 rounded to the direction @var{rnd}
! 1199: with the precision of @var{rop}. This function stores the computed
! 1200: value to avoid another calculation if a lower or equal precision is
! 1201: requested.
! 1202: @end deftypefun
! 1203:
! 1204: @deftypefun void mpfr_const_pi (mpfr_t @var{rop}, mp_rnd_t @var{rnd})
! 1205: Set @var{rop} to the value of Pi rounded to the direction @var{rnd}
! 1206: with the precision of @var{rop}. This function uses the Borwein, Borwein,
! 1207: Plouffe formula which directly gives the expansion of Pi in base 16.
! 1208: @end deftypefun
! 1209:
! 1210: @deftypefun void mpfr_const_euler (mpfr_t @var{rop}, mp_rnd_t @var{rnd})
! 1211: Set @var{rop} to the value of Euler's constant 0.577...
! 1212: rounded to the direction @var{rnd} with the precision of @var{rop}.
! 1213: @end deftypefun
! 1214:
! 1215: @node I/O of Floats, Miscellaneous Float Functions, Float Comparison, Floating-point Functions
! 1216: @comment node-name, next, previous, up
! 1217: @section Input and Output Functions
! 1218: @cindex Float input and output functions
! 1219: @cindex Input functions
! 1220: @cindex Output functions
! 1221: @cindex I/O functions
! 1222:
! 1223: Functions that perform input from a standard input/output
! 1224: stream, and functions that output to
! 1225: a standard input/output stream.
! 1226: Passing a null pointer for a @var{stream} argument to any of
! 1227: these functions will make them read from @code{stdin} and write to
! 1228: @code{stdout}, respectively.
! 1229:
! 1230: When using any of these functions, it is a good idea to include @file{stdio.h}
! 1231: before @file{mpfr.h}, since that will allow @file{mpfr.h} to define prototypes
! 1232: for these functions.
! 1233:
! 1234: @deftypefun size_t mpfr_out_str (FILE *@var{stream}, int @var{base}, size_t @var{n_digits}, mpfr_t @var{op}, mp_rnd_t @var{rnd})
! 1235: Output @var{op} on stdio stream @var{stream}, as a string of digits in
! 1236: base @var{base}, rounded to direction @var{rnd}.
! 1237: The base may vary from 2 to 36. Print at most
! 1238: @var{n_digits} significant digits, or if @var{n_digits} is 0, the maximum
! 1239: number of digits accurately representable by @var{op}.
! 1240:
! 1241: In addition to the significant digits, a decimal point at the right of the
! 1242: first digit and a
! 1243: trailing exponent, in the form @samp{eNNN}, are printed. If @var{base}
! 1244: is greater than 10, @samp{@@} will be used instead of @samp{e} as
! 1245: exponent delimiter.
! 1246:
! 1247: Return the number of bytes written, or if an error occurred, return 0.
! 1248: @end deftypefun
! 1249:
! 1250: @deftypefun size_t mpfr_inp_str (mpfr_t @var{rop}, FILE *@var{stream}, int @var{base}, mp_rnd_t @var{rnd})
! 1251: Input a string in base @var{base} from stdio stream @var{stream},
! 1252: rounded in direction @var{rnd}, and put the
! 1253: read float in @var{rop}. The string is of the form @samp{M@@N} or, if the
! 1254: base is 10 or less, alternatively @samp{MeN} or @samp{MEN}.
! 1255: @samp{M} is the mantissa and
! 1256: @samp{N} is the exponent. The mantissa is always in the specified base. The
! 1257: exponent is
! 1258: @c either in the specified base or, if @var{base} is negative,
! 1259: in decimal.
! 1260:
! 1261: The argument @var{base} may be in the range 2 to 36.
! 1262: @c , or @minus{}36 to
! 1263: @c @minus{}2. Negative values are used to specify that the exponent is in
! 1264: @c decimal.
! 1265:
! 1266: Unlike the corresponding @code{mpz} function, the base will not be determined
! 1267: from the leading characters of the string if @var{base} is 0. This is so that
! 1268: numbers like @samp{0.23} are not interpreted as octal.
! 1269:
! 1270: Return the number of bytes read, or if an error occurred, return 0.
! 1271: @end deftypefun
! 1272:
! 1273: @deftypefun void mpfr_print_binary (mpfr_t @var{float})
! 1274: Output @var{float} on stdout
! 1275: in raw binary format (the exponent is in decimal, yet).
! 1276: The last bits from the least significant limb which do not belong to
! 1277: the mantissa are printed between square brackets;
! 1278: they should always be zero.
! 1279: @end deftypefun
! 1280:
! 1281: @c @deftypefun void mpfr_inp_raw (mpfr_t @var{float}, FILE *@var{stream})
! 1282: @c Input from stdio stream @var{stream} in the format written by
! 1283: @c @code{mpfr_out_raw}, and put the result in @var{float}.
! 1284: @c @end deftypefun
! 1285:
! 1286:
! 1287: @node Miscellaneous Float Functions, , I/O of Floats, Floating-point Functions
! 1288: @comment node-name, next, previous, up
! 1289: @section Miscellaneous Functions
! 1290: @cindex Miscellaneous float functions
! 1291:
! 1292: @deftypefun int mpfr_rint (mpfr_t @var{rop}, mpfr_t @var{op}, mp_rnd_t @var{rnd})
! 1293: @deftypefunx int mpfr_ceil (mpfr_t @var{rop}, mpfr_t @var{op})
! 1294: @deftypefunx int mpfr_floor (mpfr_t @var{rop}, mpfr_t @var{op})
! 1295: @deftypefunx int mpfr_round (mpfr_t @var{rop}, mpfr_t @var{op})
! 1296: @deftypefunx int mpfr_trunc (mpfr_t @var{rop}, mpfr_t @var{op})
! 1297: Set @var{rop} to @var{op} rounded to an integer. @code{mpfr_ceil} rounds
! 1298: to the next higher representable integer, @code{mpfr_floor} to the next lower,
! 1299: @code{mpfr_round} to the nearest representable integer, rounding halfway cases
! 1300: away from zero, and @code{mpfr_trunc} to the representable integer towards
! 1301: zero. @code{mpfr_rint} behaves like one of these four functions, depending
! 1302: on the rounding mode.
! 1303: The returned value is zero when the result is exact, positive when it is
! 1304: greater than the original value of @var{op}, and negative when it is smaller.
! 1305: More precisely, the returned value is 0 when @var{op} is an integer
! 1306: representable in @var{rop}, 1 or @minus{}1 when @var{op} is an integer
! 1307: that is not representable in @var{rop}, 2 or @minus{}2 when @var{op} is
! 1308: not an integer.
! 1309: @end deftypefun
! 1310:
! 1311: @deftypefun void mpfr_urandomb (mpfr_t @var{rop}, gmp_randstate_t @var{state})
! 1312: Generate a uniformly distributed random float in the interval 0 <= X < 1.
! 1313: @end deftypefun
! 1314:
! 1315: @deftypefun void mpfr_random (mpfr_t @var{rop})
! 1316: Generate a uniformly distributed random float in the interval 0 <= X < 1.
! 1317: @end deftypefun
! 1318:
! 1319: @deftypefun void mpfr_random2 (mpfr_t @var{rop}, mp_size_t @var{max_size}, mp_exp_t @var{max_exp})
! 1320: Generate a random float of at most @var{max_size} limbs, with long strings of
! 1321: zeros and ones in the binary representation. The exponent of the number is in
! 1322: the interval @minus{}@var{exp} to @var{exp}.
! 1323: This function is useful for
! 1324: testing functions and algorithms, since this kind of random numbers have
! 1325: proven to be more likely to trigger corner-case bugs.
! 1326: Negative random numbers are generated when @var{max_size} is negative.
! 1327: @end deftypefun
! 1328:
! 1329: @c @deftypefun size_t mpfr_size (mpfr_t @var{op})
! 1330: @c Return the size of @var{op} measured in number of limbs. If @var{op} is
! 1331: @c zero, the returned value will be zero. (@xref{Nomenclature}, for an
! 1332: @c explanation of the concept @dfn{limb}.)
! 1333: @c
! 1334: @c @strong{This function is obsolete. It will disappear from future MP
! 1335: @c releases.}
! 1336: @c @end deftypefun
! 1337:
! 1338: @section Internals
! 1339:
! 1340: These types and
! 1341: functions were mainly designed for the implementation of @code{mpfr},
! 1342: but may be useful for users too.
! 1343: However no upward compatibility is guaranteed.
! 1344: You need to include @code{mpfr-impl.h} to use them.
! 1345:
! 1346: The @code{mpfr_t} type consists of four fields.
! 1347: The @code{_mpfr_prec} field is used to store the precision of
! 1348: the variable (in bits); this is not less than 2.
! 1349:
! 1350: The @code{_mpfr_size} field is used to store the number of
! 1351: allocated limbs, with the high bits reserved to store
! 1352: the sign (bit 31), the NaN flag (bit 30),
! 1353: and the Infinity flag (bit 29);
! 1354: thus bits 0 to 28 remain for the number of allocated limbs, with a maximal
! 1355: value of 536870911.
! 1356: A NaN is indicated by the NaN flag set, and no other fields are
! 1357: relevant.
! 1358: An Infinity is indicated by the NaN flag clear and the Inf flag set;
! 1359: the sign bit of an Infinity indicates the sign, the limb data
! 1360: and the exponent are not relevant.
! 1361:
! 1362: The @code{_mpfr_exp} field stores the exponent.
! 1363: An exponent of 0 means a radix point just above the most significant
! 1364: limb. Non-zero values are a multiplier @math{2^n} relative to that
! 1365: point.
! 1366:
! 1367: Finally, the @code{_mpfr_d} is a pointer to the limbs, least
! 1368: significant limbs stored first.
! 1369: The number zero is represented with its most significant limb set to zero,
! 1370: i.e. @code{_mpfr_d[n-1]} where
! 1371: n=ceil(@code{_mpfr_prec}/@code{BITS_PER_MP_LIMB}).
! 1372: The number of limbs in use is controlled by @code{_mpfr_prec}, namely
! 1373: ceil(@code{_mpfr_prec}/@code{BITS_PER_MP_LIMB}).
! 1374: Zero is represented by the most significant limb being zero, other
! 1375: limb data and the exponent are not relevant
! 1376: ("not relevant" implies that the corresponding objects may contain
! 1377: invalid values, thus should not be evaluated even if
! 1378: they are not taken into account).
! 1379: Non-zero values always have the most significant bit of the most
! 1380: significant limb set to 1. When the precision is not a whole number
! 1381: of limbs, the excess bits at the low end of the data are zero.
! 1382: When the precision has been lowered by @code{mpfr_set_prec}, the space
! 1383: allocated at @code{_mpfr_d} remains as given by @code{_mpfr_size}, but
! 1384: @code{_mpfr_prec} indicates how much of that space is actually used.
! 1385:
! 1386: @deftypefun int mpfr_add_one_ulp (mpfr_t @var{x}, mp_rnd_t @var{rnd})
! 1387: Add one unit in last place (ulp) to @var{x} if @var{x} is finite
! 1388: and positive, subtract one ulp if @var{x} is finite and negative;
! 1389: otherwise, @var{x} is not changed.
! 1390: The return value is zero unless an overflow occurs, in which case the
! 1391: @code{mpfr_add_one_ulp} function behaves like a conventional addition.
! 1392: @end deftypefun
! 1393:
! 1394: @deftypefun int mpfr_sub_one_ulp (mpfr_t @var{x}, mp_rnd_t @var{rnd})
! 1395: Subtract one ulp to @var{x} if @var{x} is finite and positive, add one
! 1396: ulp if @var{x} is finite and negative; otherwise, @var{x} is not changed.
! 1397: The return value is zero unless an underflow occurs, in which case the
! 1398: @code{mpfr_sub_one_ulp} function behaves like a conventional subtraction.
! 1399: @end deftypefun
! 1400:
! 1401: @deftypefun int mpfr_can_round (mpfr_t @var{b}, mp_exp_t @var{err}, mp_rnd_t @var{rnd1}, mp_rnd_t @var{rnd2}, mp_prec_t @var{prec})
! 1402: Assuming @var{b} is an approximation of an unknown number
! 1403: @var{x} in direction @var{rnd1} with error at most two to the power
! 1404: E(b)-@var{err} where E(b) is the exponent of
! 1405: @var{b}, returns 1 if one is able to round exactly @var{x} to precision
! 1406: @var{prec} with direction @var{rnd2},
! 1407: and 0 otherwise. This function @strong{does not modify} its arguments.
! 1408: @end deftypefun
! 1409:
! 1410: @node Contributors, References, Floating-point Functions, Top
! 1411: @comment node-name, next, previous, up
! 1412: @unnumbered Contributors
! 1413:
! 1414: The main developers consist of Guillaume Hanrot, Vincent Lefèvre and
! 1415: Paul Zimmermann.
! 1416:
! 1417: We would like to thank Jean-Michel Muller and Joris van der Hoeven for very
! 1418: fruitful discussions at the beginning of that project, Torbjorn Granlund
! 1419: and Kevin Ryde
! 1420: for their help about design issues
! 1421: and their suggestions for an easy integration into GNU MP,
! 1422: and Nathalie Revol for her careful reading of this documentation.
! 1423:
! 1424: Sylvie Boldo from ENS-Lyon, France,
! 1425: contributed the functions @code{mpfr_agm} and @code{mpfr_log}.
! 1426: Emmanuel Jeandel, from ENS-Lyon too,
! 1427: contributed the generic hypergeometric code in
! 1428: @code{generic.c}, as well as the @code{mpfr_exp3},
! 1429: a first implementation of the sine and cosine,
! 1430: and improved versions of
! 1431: @code{mpfr_const_log2} and @code{mpfr_const_pi}.
! 1432: Mathieu Dutour contributed the functions @code{mpfr_atan} and @code{mpfr_asin},
! 1433: David Daney contributed the hyperbolic and inverse hyperbolic functions,
! 1434: the base-2 exponential, and the factorial function. Fabrice Rouillier
! 1435: contributed the original version of @file{mul_ui.c}, the @file{gmp_op.c}
! 1436: file, and helped to the Windows porting.
! 1437:
! 1438: @node References, Concept Index, Contributors, Top
! 1439: @comment node-name, next, previous, up
! 1440: @unnumbered References
! 1441:
! 1442: @itemize @bullet
! 1443:
! 1444: @item
! 1445: Torbjorn Granlund, "GNU MP: The GNU Multiple Precision Arithmetic Library",
! 1446: version 4.0.1, 2001.
! 1447:
! 1448: @item
! 1449: IEEE standard for binary floating-point arithmetic, Technical Report
! 1450: ANSI-IEEE Standard 754-1985, New York, 1985.
! 1451: Approved March 21, 1985: IEEE Standards Board; approved July 26,
! 1452: 1985: American National Standards Institute, 18 pages.
! 1453:
! 1454: @item
! 1455: Donald E. Knuth, "The Art of Computer Programming", vol 2,
! 1456: "Seminumerical Algorithms", 2nd edition, Addison-Wesley, 1981.
! 1457:
! 1458: @end itemize
! 1459:
! 1460: @node Concept Index, Function Index, References, Top
! 1461: @comment node-name, next, previous, up
! 1462: @unnumbered Concept Index
! 1463: @printindex cp
! 1464:
! 1465: @node Function Index, , Concept Index, Top
! 1466: @comment node-name, next, previous, up
! 1467: @unnumbered Function and Type Index
! 1468: @printindex fn
! 1469:
! 1470: @contents
! 1471: @bye
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>