一尘不染

戈朗C长双

go

我正在将算法从C移植到Go。我有些困惑。这是C函数:

void gauss_gen_cdf(uint64_t cdf[], long double sigma, int n)
{
    int i;
    long double s, d, e;

    //Calculations ...

    for (i = 1; i < n - 1; i++) {
       cdf[i] = s;
    }   
}

在for循环中,将值s分配给元素cd数组x。这怎么可能?据我所知,长双精度数是float64(在Go上下文中)。因此,我不应该编译C代码,因为我正在向只包含uint64元素的数组分配一个long
double。但是C代码可以正常工作。

那么有人可以解释为什么这行得通吗?

非常感谢你。

更新:

该函数的原始C代码可以在以下位置找到:https
:
//github.com/mjosaarinen/hilabliss/blob/master/distribution.c#L22


阅读 298

收藏
2020-07-02

共1个答案

一尘不染

该赋值cdf[i] = s执行对的隐式转换uint64_t。没有您省略的计算,很难说出是否打算这样做。

在实践中,long double一种类型在整个体系结构中都有相当大的差异。Go’s
float64是否适合替代取决于您要移植的体系结构。例如,在x86上,long double是80字节的扩展精度类型,但是Windows系统通常配置为仅使用53位尾数来计算结果,这float64对于您的目的仍然可以等同。

编辑 在这种特殊情况下,由源计算的值似乎是静态的,并且与输入无关。我只想float64在Go端使用,看看在实际GNU /
Linux下的x86机器上运行时,计算值是否与C版本的计算值相同(虚拟化应该可以),以解决Windows
FPU问题。选择x86只是一个猜测,因为它很可能是原始作者所使用的。我不了解底层的加密技术,因此无法说出计算值的差异是否会影响安全性。(还要注意,C代码似乎无法正确植入其PRNG。)

2020-07-02