[英]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是值为1的unsigned long long int
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,所以我甚至都需要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被签名,它就可以正常工作。
要修复它,我建议您对所有变量使用相同的类型(双精度)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.