gpt4 book ai didi

c++ - unsigned long long算术转换为double

转载 作者:行者123 更新时间:2023-11-28 00:53:22 25 4
gpt4 key购买 nike

我正在编写一个函数,它接受 3 个 unsigned long long,并应用余弦定律来确定三角形是钝角三角形、锐角三角形还是直角三角形。我应该在使用变量之前将它们转换为 double 值吗?

void triar( unsigned long long& r, 
unsigned long long x,
unsigned long long y,
unsigned long long z )
{
if(x==0 || y==0 || z==0) die("invalid triangle sides");

double t=(x*x + y*y -z*z)/(2*x*y);

t=acos (t) * (180.0 / 3.14159265);

if(t > 90) {
cout<<"Obtuse Triangle"<<endl;
r=t;

} else if(t < 90){
cout<<"Acute Triangle"<<endl;
r=t;

} else if(t == 90){
cout<<"Right Traingle"<<endl;
r=t;

}
}

最佳答案

如果需要浮点运算,通常没有理由不进行转换。但是,还有一个从 unsigned long 的隐式转换。至 double ,因此您通常也可以完全不进行转换。

在许多情况下,包括您的情况,您只能将其中一个参数转换为强制 double仅针对特定操作的算术。例如,

double t = (double)(x*x + y*y - z*z) / (2*x*y)

这样,除了除法之外的所有操作都在整数算术中计算,因此速度略快。类型转换仍然是必要的,以避免在除法期间被截断。

您的代码包含浮点参数的比较。然而,浮点运算几乎不可避免地会降低准确性。避免有限的精度,或分析和控制精度。

  • 如果您有足够广泛的整数类型供您使用,请首选整数解决方案,如优秀姊妹答案中所述

  • 除非向人类展示,否则始终避免从弧度转换为度数

  • 从您的数学库头文件中获取 π 的值(不幸的是,这取决于平台 - 尝试 _USE_MATH_DEFINES + M_PI 或者,如果已经在使用 boost 库,则 boost::math::constants::pi<double>() ),或者以解析方式表达它.例如,std::atan(1)*2是直角。

  • 如果您选择 double ,并且最终差值小于,比方说,std::numeric_limits<double>::min() * 8 ,您可能无法说明有关三角形的任何信息,并且您返回的分类基本上是虚假的。 (我补了 8 的值,你可能会丢失比三更多的位。)

关于c++ - unsigned long long算术转换为double,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12829285/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com