如何在计算中处理 "unsigned long long int"?

How to handle "unsigned long long int" in computations?

我有 64b 架构和 Windows 和 g++ 6.3.0,在某些情况下公式有问题:

double a = (element_radius_square - element_to_check_intersection.radius * element_to_check_intersection.radius + distance_between_centers * distance_between_centers) / (2 * distance_between_centers);

element_radius_square 是 unsigned long long int,值为 1

element_to_check_intersection.radius 是值为 7

的整数

distance_between_centers 是 double,值为 8

所以输出应该是1,但是是1.152921504606847e+018

当更改为:

double a = element_radius_square;
a = (a - element_to_check_intersection.radius * element_to_check_intersection.radius + distance_between_centers * distance_between_centers) / (2 * distance_between_centers);

结果是 1(符合预期)

这一行有什么问题,如何在需要 unsigned long long int 的地方整齐地编写代码?

编辑:distance_between_centers 和 element_to_check_intersection.radius 都可以是 -1000000 或 1000000,所以即使对它们我也需要 unsigned long long int,但是转换成它就像:

double a = element_radius_square;
a = (a - (unsigned long long int)element_to_check_intersection.radius * element_to_check_intersection.radius + (unsigned long long int)distance_between_centers * distance_between_centers) / (2 * distance_between_centers);

在某些情况下会失去如此多的精度 (0.06),以至于我需要更好的解决方案。

我需要 128b 类型还是我错误地使用了 unsigned long long int?

主要问题是 element_radius_squareunsigned,因此在评估期间,第一部分被评估为 unsigned,即:

1ull - 49 = 18446744073709551568ull

当你将它转换为 double 时,它​​工作得很好,因为 double 是有符号的。

为了解决这个问题,我建议您对所有变量使用相同的类型 (double)