如何在计算中处理 "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_square
是 unsigned,因此在评估期间,第一部分被评估为 unsigned,即:
1ull - 49
= 18446744073709551568ull
当你将它转换为 double 时,它工作得很好,因为 double 是有符号的。
为了解决这个问题,我建议您对所有变量使用相同的类型 (double)
我有 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_square
是 unsigned,因此在评估期间,第一部分被评估为 unsigned,即:
1ull - 49
= 18446744073709551568ull
当你将它转换为 double 时,它工作得很好,因为 double 是有符号的。
为了解决这个问题,我建议您对所有变量使用相同的类型 (double)