More revisions for numbers.texi
Stephen J. Turnbull
stephen at xemacs.org
Thu May 20 23:09:38 EDT 2004
OK, that round is done, but I've discovered a few things I have
questions on.
(1) This looks to be a genuine bug: curiously enough,
(= 1/3 (coerce 1/3 'bigfloat))
==> t
which is OK, but
(= 1/3 (coerce 1/3 'float))
|--> Wrong type argument: numberp, 1/3
which is an "oops."
(2) We need to document coercion, especially and how to give bigfloats
precision. Problem: I'd like to avoid recommending use of
`coerce-number' but cl-extra's `coerce' doesn't allow setting of
precision. Can we extend `coerce'?
`coerce', `coerce-number', `default-float-precision', and
`bigfloat-max-prec' need to be documented (I can do most of that,
review appreciated of course), but
(3) I would prefer that `bigfloat-max-prec' be spelled
`bigfloat-maximum-precision'.
(4) `default-float-precision' is documented like this
DEFVAR_LISP_MAGIC ("default-float-precision", &Vdefault_float_precision, /*
The default floating-point precision for newly created floating point values.
This should be 0 for the precision of the machine-supported floating point
type (the C double type), or an unsigned integer no greater than
bigfloat-max-prec (currently the size of a C unsigned long).
*/ default_float_precision_changed);
Vdefault_float_precision = make_int (0);
but `bigfloat-max-prec' is currently `most-positive-fixnum', not
ULONG_MAX.
If dumping of bignums is on your immediate agenda, this can stay
(except that ULONG_MAX should be translated as "the maximum value of a
C unsigned long"), I guess. Another possibility is to move the code
that initializes `bigfloat-max-prec' to another function, and call it
at the end of emacs.c:main_1() wrapped in "if (initialized)". Or
dump a fixnum, then duplicate it and make it bigger at runtime.
Anybody who thinks they need ULONG_MAX of precision in bigfloats at
dump time, well, I just don't understand them....
(5) Shouldn't `bigfloat-max-prec' be a constant (see the declaration
of `most-positive-fixnum')?
(6) Don't we need an API to query the precision of a bigfloat?
(7) Don't we need an API to query the default precision of the
underlying MP library in case `(= default-float-precision 0)'?
Setting it, too, although the already implemented fiddling with
`default-float-precision' would usually be good enough,
(progn
(setq default-float-precision my-desired-bigfloat-precision)
(setq default-float-precision 0))
is awful ugly.
(8) In checking what I thought was a typo, I discovered the following:
(setq x1 1.0)
(setq x2 (coerce 1.0 'bigfloat))
(= x1 x2)
==> t
(eql x1 x2)
==> nil
(setq x3 (coerce-number 1.0 'bigfloat 500))
(eql x2 x3)
==> t ;; SURPRISE!
;; let's make absolutely sure
(setq x4 (coerce-number 1.0 'bigfloat 1000))
(eql x3 x4)
==> t ;; SURPRISE!
If that's true, then I think that (eql x1 x4) should be true, too.
That would be consistent with the way that default-float-precision
works. Alternatively, we could make bigfloats of different precision
be different types (as I originally expected) but that has the problem
that we have no way to represent those types (ie, bigfloatp doesn't
take a precision argument).
Comments?
--
Institute of Policy and Planning Sciences http://turnbull.sk.tsukuba.ac.jp
University of Tsukuba Tennodai 1-1-1 Tsukuba 305-8573 JAPAN
Ask not how you can "do" free software business;
ask what your business can "do for" free software.
More information about the XEmacs-Beta
mailing list