Я не могу найти, где делю на ноль, так как я получаю 'inf' как O / P для I / P - PullRequest
0 голосов
/ 27 мая 2018

Это код для определения радиуса вкрапления сферы, вписанной в неправильный тетраэдр. Пожалуйста, помогите с поиском ошибки ...

Я имею в виду, как удалить эту часть 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 голосов
/ 27 мая 2018

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.

Честно говоря, «/ - это целочисленное деление и деление с плавающей запятой» - это одна из худших вещей в Си и языках, унаследованных от него.

0 голосов
/ 27 мая 2018

Я изменил исходный код с:

double s = (a + b + c)/2;

на:

double s = (a + b + c)/(2.0);

И проблема была решена.

Но я не могу понять, почемубез скобок и десятичной точки, он по-прежнему показывает inf.

...