当前位置: 首页 > 面试题库 >

戈朗C长双

仲孙钊
2023-03-14
问题内容

我正在将算法从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。没有您省略的计算,很难说出是否打算这样做。

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

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



 类似资料:
  • 有什么方法可以重写panic功能来使用我们的记录器吗?

  • 用围棋的语言, 是一个字符串数组 我们还使用作为参数。 有什么区别? 功能定义: 我可以像下面那样调用这个函数吗?

  • 问题内容: Go语言规范的“地图类型”部分描述了地图类型的界面和常规用法,The Go Blog上 的“ Go maps in action”一文中 偶然提到了哈希表和“快速查找,添加和删除”。 的电流源代码描述了其作为散列表实施方案(其通常摊销); 但是,在语言规范或其他材料中我看不到任何性能特征(例如Big O性能)的保证。 go语言是否为地图类型或仅 接口 保证了任何 性能 保证(例如,恒定

  • 我想构建一个http反向代理,它检查http主体,然后向其上游服务器发送http请求。你怎么能在围棋中做到这一点? 初始尝试(随后)失败,因为ReverseProxy复制传入请求,修改并发送请求,但正文已被读取。 然后,我的下一个尝试是将整个正文读入字节。读卡器,并使用它检查正文内容,在发送到上游服务器之前查找开头部分。但是接下来我必须重新实现我想要避免的ReverseProxy。还有其他优雅的方

  • 我很难理解如何在Mongo C#2.4驱动程序中执行操作。 我收藏了910多万张平面文件。在Robomongo中执行时,查询需要0秒,并返回所需的结果。 在C#中,这大约需要7-8秒。 目前,我正在实现一个查找,如下所示: 在上找不到或方法,因此我怀疑只是在执行mongo函数。我可以看到有、和,但没有。 我为查询使用的筛选器定义如下: 基本上,在C#驱动程序中执行的正确方法是什么?