在C中将long转换为float

标签 c cuda floating-point

我遇到了大 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/

相关文章:

c - 如何使用指针和动态内存将结构传递到函数中进行打印 [C 编程]

c - 编译器在值的后增量和预增量中的行为如何?

c++ - 向设备发送 char ** 数据类型

c - Cuda by Example 中非常简单的教程的问题

ios - 为什么 GLSL 的算术函数在 iPad 上与在模拟器上产生如此不同的结果?

c - For循环增强但有歧义

c - 函数 'getch' 的隐式声明

cuda - 2D/3D CUDA block 如何划分为经线?

java - JAX-WS 2.0 - 从 xsd :double to xsd:decimal 迁移

c - +0.0 和 -0.0 上的哪些运算和函数给出不同的算术结果?