Как найти пустое пространство в прямоугольнике, в котором есть 2 круга? - PullRequest
0 голосов
/ 06 января 2020

Я решаю проблему в Toph . В этой задаче я должен найти пустое пространство прямоугольника, в котором есть 2 равных круга.

здесь есть проблема

#include <stdio.h>
float pi=3.1416;
int main()
{
    int i,t;
    float r,rest;
    scanf("%d",&t);
    for(i=1;i<=t;i++)
    {
        scanf("%f",&r);
        rest=(4*r*2*r)-(2*pi*r*r);
        printf("Case %d: %.2f\n",i,rest);
    }
    return 0;

Вот мое решение Он возвращает правильное значение для первого контрольного примера, но не может решить второй. В чем проблема ???

Ответы [ 2 ]

1 голос
/ 06 января 2020

float pi=3.1416; является причиной проблемы. Под файлом математического заголовка (#include <math.h>) есть константа M_PI, используйте его вместо этого.

Редактировать: Извините, не прочитал полностью, очевидно, проблема в точности с плавающей запятой. Если вы измените все значения с плавающей точкой на double, это должно сработать.

#include <stdio.h>
double pi=3.1416;
int main()
{
    int i,t;
    double r,rest;
    scanf("%d",&t);
    for(i=1;i<=t;i++)
    {
        scanf("%lf",&r);
        rest=(4*r*2*r)-(2*pi*r*r);
        printf("Case %d: %.2lf\n",i,rest);
    }
    return 0;
}
0 голосов
/ 06 января 2020

В отличие от 2 и 8, причина double является более точной, потому что float не может представлять 3.1416 , а также входные значения:

3.1416 -> 3.1415998935699462890625
40.082 -> 40.082000732421875
85.8   -> 85.8000030517578125

Там просто недостаточно точность (обратите внимание, что IEEE-754 float, который в подавляющем большинстве случаев используется для float, сохраняет его в base-2.) Скорее всего, более поздние числа были, вероятно, специально сгенерированы для того, чтобы провалить контрольные примеры. Если кто-то хочет знать больше, Не сохраняйте это в формате Float и Что должен знать каждый компьютерщик об арифметике с плавающей точкой c.

Числовая константа равна 1.7168, что является точным условием, если принять их версию pi , (times r*r.). Лучшая из возможных с точностью до одной точки - 1.7167999744415283203125, которая отключена на 2.55584716796875E-8. С double это 1.71680000000000010373923942097, выключено на 1.0373923942097E-16, плюс ввод значений.

...