gpt4 book ai didi

在C中将long转换为float

转载 作者:行者123 更新时间:2023-11-30 14:34:44 24 4
gpt4 key购买 nike

我遇到了大 float 的问题。我正在采用一些 vector 的 l2 范数,并且在处理大点值时遇到问题。例如,将 vec 视为 vector :

float vec[] = { 10001.000000, 10002.000000, 10000.000000, 10003.000000,
10003.000000, 10002.000000, 10003.000000 };
float sumzz = 0;
for (int i = 0; i < 7; i++) {
sumzz += pow(vec[i], 2);
}

输出为“700280064”,这是错误的,因为正确的值为“700280036”。

所以我尝试了一些东西,我发现当我将一些大值转换为 float 时,它会失去精度。另一个例子:

long num = 5502160332;
printf("%ld\n", num);
printf("%f\n", (float) num);

第一次打印的输出显然是 5502160332,而第二次打印的输出是 5502160384。难道我做错了什么?这个问题有解决办法吗?

编辑:正如我在评论中提到的,问题是我应该尽可能少地使用 double 值,因为我正在使用 CUDA,除了 Tesla 或高端 Quadro 卡之外, double 值有 1/与 float 或其他类型相比,效率为 32。

最佳答案

如果您坚持使用 float ,您别无选择,只能接受有限的精度。

但是由于有限的精度使您的程序无法在后面的矩阵中给出 NaN 和 0 条目,因此除了使用 double 之外别无选择。即使这也有限制,只是更大一些。

在这种情况下,您的选择是 1/32 的速度,或者恐怕根本没有结果。或者寻找一种不同的算法来构建不太容易出现错误的矩阵。

PS:您可以将 vector 保留为 float ,然后转换为 double 以计算矩阵并将其转换回 float 。因此,在准确性关键步骤之前和之后的任何事情都可以保持快速。

关于在C中将long转换为float,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58855928/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com