[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