我正在将算法从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
该赋值cdf[i] = s执行对的隐式转换uint64_t。没有您省略的计算,很难说出是否打算这样做。
cdf[i] = s
uint64_t
在实践中,long double一种类型在整个体系结构中都有相当大的差异。Go’s float64是否适合替代取决于您要移植的体系结构。例如,在x86上,long double是80字节的扩展精度类型,但是Windows系统通常配置为仅使用53位尾数来计算结果,这float64对于您的目的仍然可以等同。
long double
float64
编辑 在这种特殊情况下,由源计算的值似乎是静态的,并且与输入无关。我只想float64在Go端使用,看看在实际GNU / Linux下的x86机器上运行时,计算值是否与C版本的计算值相同(虚拟化应该可以),以解决Windows FPU问题。选择x86只是一个猜测,因为它很可能是原始作者所使用的。我不了解底层的加密技术,因此无法说出计算值的差异是否会影响安全性。(还要注意,C代码似乎无法正确植入其PRNG。)