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

时间:2018-02-12 03:09:46

标签: c++ g++ unsigned-long-long-int

我有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是无符号long long int,值为1

element_to_check_intersection.radius是int,值为7

distance_between_centers是值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,所以我需要无符号长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类型或者我是否正确使用无符号long long int?

1 个答案:

答案 0 :(得分:3)

主要问题是element_radius_square 无符号,因此在评估期间,第一部分被评估为无符号,即:

1ull - 49 = 18446744073709551568ull

当你把它加成双倍时,它就可以了,因为签名是双倍的。

修复它我建议你对所有变量使用相同的类型(double)