mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-18 17:50:29 +02:00
* Makefile.am: Distribute num2float.i.c.
* num2float.i.c: New file, multiply included by numbers.c, used to "templatize" the float <-> num conversion routines. * numbers.c: New functions: scm_num2float, scm_float2num, scm_num2double, scm_double2num.
This commit is contained in:
parent
b21cccf315
commit
5437598b36
5 changed files with 78 additions and 1 deletions
50
libguile/num2float.i.c
Normal file
50
libguile/num2float.i.c
Normal file
|
@ -0,0 +1,50 @@
|
|||
/* this file is #include'd (several times) by numbers.c */
|
||||
|
||||
FTYPE
|
||||
NUM2FLOAT (SCM num, unsigned long int pos, const char *s_caller)
|
||||
{
|
||||
if (SCM_INUMP (num))
|
||||
return SCM_INUM (num);
|
||||
else if (SCM_BIGP (num))
|
||||
{ /* bignum */
|
||||
|
||||
FTYPE res = 0.0;
|
||||
size_t l;
|
||||
|
||||
for (l = SCM_NUMDIGS (num); l--;)
|
||||
res = SCM_BIGRAD * res + SCM_BDIGITS (num)[l];
|
||||
|
||||
if (SCM_BIGSIGN (num))
|
||||
res = -res;
|
||||
|
||||
if (isfinite (res))
|
||||
return res;
|
||||
else
|
||||
scm_out_of_range (s_caller, num);
|
||||
}
|
||||
else if (SCM_REALP (num))
|
||||
return SCM_REAL_VALUE (num);
|
||||
else
|
||||
scm_wrong_type_arg (s_caller, pos, num);
|
||||
}
|
||||
|
||||
SCM
|
||||
FLOAT2NUM (FTYPE n)
|
||||
{
|
||||
SCM z;
|
||||
SCM_NEWCELL2 (z);
|
||||
SCM_SET_CELL_TYPE (z, scm_tc16_real);
|
||||
SCM_REAL_VALUE (z) = n;
|
||||
return z;
|
||||
}
|
||||
|
||||
/* clean up */
|
||||
#undef FLOAT2NUM
|
||||
#undef NUM2FLOAT
|
||||
#undef FTYPE
|
||||
|
||||
/*
|
||||
Local Variables:
|
||||
c-file-style: "gnu"
|
||||
End:
|
||||
*/
|
Loading…
Add table
Add a link
Reference in a new issue