You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言long double映射至Raku及调用对应C函数的方法

从Raku调用接收long double类型的C函数

给定如下C函数:

long double foo(long double *array, size_t n) {
    // 执行相关操作
}

如何从Raku中调用该函数?Rakudo原生类型文档中列出了部分Raku与C类型的对应关系:

RakuC类型
longlong in C
longlonglonglong in C
ulonglong and unsigned in C
ulonglonglonglong and unsigned in C
size_tsize_t and unsigned in C
ssize_tsize_t in C
boolbool in C

我曾尝试将long double映射为long num64,但该方式并不生效。


解决方法

在Raku中,long double对应的原生类型是num128(依赖平台对128位浮点数的支持,现代多数编译器与系统均兼容)。需借助NativeCall模块完成函数绑定:

  1. 导入NativeCall模块:
use NativeCall;
  1. 声明C函数绑定,指定正确类型:
sub foo(CArray[num128] $array, size_t $n --> num128) is native { * }

注:C中的指针参数long double *array,在Raku中可通过CArray[num128]显式声明数组类型,NativeCall会自动处理指针转换。

  1. 调用示例:
# 创建num128类型数组
my CArray[num128] $c-array = CArray[num128].new: num128(1.5), num128(2.7), num128(3.9);
# 调用函数并传递参数
my num128 $result = foo($c-array, 3);
say $result;

若平台不支持num128,可尝试num64替代,但会丢失long double的精度,仅作为临时方案。


内容的提问来源于stack exchange,提问作者Suman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 22:12:43