这是用于查找刻在不规则四面体中的球体的圆周半径的代码, 请帮助找到出错的地方......
Imean如何删除那个inf部分,并告诉我们公式的实现部分是否有任何错误。 因为我对第二种情况的答案是错误的......
#include <stdio.h>
#include <math.h>
double cosine (int a, int b, int c)
{
double temp = ( a*a + b*b - c*c ) / (2.0 * a * b);
return (temp);
}
double area (int a, int b, int c)
{
double s = (a + b + c )/2 ;
double ar = sqrt(s*(s-a)*(s-b)*(s-c));
return(ar);
}
int main()
{
long int t = 0, T = 0;
scanf("%ld", &T);
while(t++ < T)
{
int AB, BC, AC, AD, BD, CD;
double cos1, cos2, cos3,ar1,ar2,ar3,ar4;
scanf("%d%d%d%d%d%d", &AB, &AC, &AD, &BC, &BD, &CD);
cos1 = cosine(AD, BD, AB);
cos2 = cosine(BD, CD, BC);
cos3 = cosine(CD, AD, AC);
ar1 = area(AD, BD, AB);
ar2 = area(BD, CD, BC);
ar3 = area(CD, AD, AC);
ar4 = area(AB, BC, AC);
double temp = sqrt( 1 + 2 * cos1 * cos2 * cos3 - cos1*cos1 - cos2*cos2 -
cos3*cos3);
double vol = AD * BD * CD * temp / 6;
double answer = 3*vol/(ar1+ar2+ar3+ar4);
printf("%0.4lf\n", answer);
}
return 0;
}
输入
2
1 1 1 1 1 1
1000 1000 1000 5 5 6
输出
inf
1.6474
答案 0 :(得分:0)
我更改了源代码:
double s = (a + b + c)/2;
为:
double s = (a + b + c)/(2.0);
问题解决了。
但是我无法理解为什么没有括号和小数点,它仍然显示inf
。
答案 1 :(得分:0)
double s = (a + b + c)/2
首先计算(a + b + c)/2
,然后将结果转换为double
。 a
,b
和c
为int
,因此这是整数除法,会丢弃余数,如果a+b+c
为1
,则为得到0
作为结果。最终你最终除以零。
当您更改为(a + b + c)/2.0
(括号不是必需的)时,您使用真正的除法,因为它首先将a + b + c
转换为double
。
我真的认为&#34; /
是整数除法和浮点除法&#34;是C和从中继承的语言中最糟糕的事情之一。