我无法找到我除以零的地方,因为我得到了' inf'作为I / P的O / P.

时间:2018-05-27 09:36:47

标签: c++14

这是用于查找刻在不规则四面体中的球体的圆周半径的代码, 请帮助找到出错的地方......

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

2 个答案:

答案 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然后将结果转换为doubleabcint,因此这是整数除法,会丢弃余数,如果a+b+c1,则为得到0作为结果。最终你最终除以零。

当您更改为(a + b + c)/2.0(括号不是必需的)时,您使用真正的除法,因为它首先将a + b + c转换为double

我真的认为&#34; /是整数除法和浮点除法&#34;是C和从中继承的语言中最糟糕的事情之一。