Racket 中的融合乘加法

Fused multiply-add in Racket

可以在 Racket 中使用 fused multiply-add 吗?

我正在尝试移植一些依赖于融合操作的单舍入的数字代码,但经过多次搜索后没有找到任何在 Racket 中使用 fma 或类似方法的方法。

谢谢!!

您可以使用 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 的其他数字类型转换为双精度数。

如果性能至关重要,您可能需要编译器 and/or 运行时支持以避免 FFI 强加的开销。在这种情况下,您可能想在 Racket Users mailing list.

上询问