是否可以在Racket中使用fused multiply-add?
我正在尝试移植一些依赖于融合操作的单个舍入的数字代码,但是在几次搜索后没有找到任何方法在Racket中使用fma
或类似的东西。
谢谢!
答案 0 :(得分:2)
您可以使用FFI:
从C库中获取它(require ffi/unsafe ffi/unsafe/define)
(define-ffi-definer define-libc #f)
(define-libc fma (_fun _double _double _double -> _double))
(fma 3.0 2.0 1.0)
;; => 7.0
这适用于Linux。在Windows上,您可能需要为define-ffi-definer
提供不同的库。
您还可以使用_double*
代替_double
作为参数,自动将Racket的其他数字类型转换为双精度数。
如果性能至关重要,您可能需要编译器和/或运行时支持以避免FFI施加的开销。在这种情况下,您可能想询问Racket Users mailing list。