我有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?
答案 0 :(得分:3)
主要问题是element_radius_square
无符号,因此在评估期间,第一部分被评估为无符号,即:
1ull - 49
= 18446744073709551568ull
当你把它加成双倍时,它就可以了,因为签名是双倍的。
修复它我建议你对所有变量使用相同的类型(double)