繁体   English   中英

在计算中如何处理“ 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是值为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_squareunsigned ,因此在求值过程中,第一部分的求值是unsigned,即:

1ull - 49 = 18446744073709551568ull

当您将其强制转换为double时,只要double被签名,它就可以正常工作。

要修复它,我建议您对所有变量使用相同的类型(双精度)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM