[cffi-devel] Grovel float constants

Liam Healy lnp at healy.washington.dc.us
Tue May 26 03:00:22 UTC 2009


On Mon, May 25, 2009 at 6:27 PM, Stelian Ionescu
<stelian.ionescu-zeus at poste.it> wrote:
> On Mon, 2009-05-25 at 17:21 -0400, Liam Healy wrote:
>> I am trying to use cffi-grovel on GSL's physical constants.
>> For example, in
>> http://git.savannah.gnu.org/cgit/gsl.git/tree/const/gsl_const_mksa.h,
>> these are defined:
>> #define GSL_CONST_MKSA_SPEED_OF_LIGHT (2.99792458e8) /* m / s */
>> #define GSL_CONST_MKSA_GRAVITATIONAL_CONSTANT (6.673e-11) /* m^3 / kg s^2 */
>>
>> When I try to define these using CFFI-grovel
>> (constant (+mksa-speed-of-light+ "GSL_CONST_MKSA_SPEED_OF_LIGHT"))
>> I end up with an integer, because the C definition is cast to an
>> integer prior to generating the
>> constant.
>>
>> Is there a way to get around this, so that I can grovel float constants?
>
> not at the moment. you would need to modify the CONSTANT directive(add
> a :type key arg that defaults to :int). patches accepted, otherwise I'll
> try to do it myself this weekend or next week
>

My hack is attached.   I supply a :format key arg instead of :type, less fuss
in mapping types to format specifiers in C.  This now works for

(constant (+mksa-speed-of-light+ "GSL_CONST_MKSA_SPEED_OF_LIGHT") :format "e")

which yields:
+mksa-speed-of-light+
2.997925e8
(type-of +mksa-speed-of-light+)
DOUBLE-FLOAT

Because C uses "e" as the exponent character even for double floats,
if you specify "e" for format, what you get will be read by Lisp is a
single float.  Therefore, I rebind *read-default-float-format* at the
top of the file with an eval-when.  The value is left as double-float
which I'm not too happy about (though I always use double-float, I
don't want to change the default).  Since C historically used double
for all floating types I think there's some justification in reading
everything as a double-float, but there's probably a better way to do
this.

Please improve on this.

Liam
-------------- next part --------------
A non-text attachment was scrubbed...
Name: cffi.diff
Type: text/x-patch
Size: 1105 bytes
Desc: not available
URL: <https://mailman.common-lisp.net/pipermail/cffi-devel/attachments/20090525/1d320f13/attachment.bin>


More information about the cffi-devel mailing list