如何在其中有 2 个圆圈的矩形中找到空 space?

How to find empty space in a rectangle which has 2 circles in it?

我正在 Toph 中解决一个问题。在这个问题中,我必须找出一个矩形的空 space,其中有 2 个相等的圆。

here is the problem

#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;

这是我的解决方案。它 returns 是第一个测试用例的正确值,但无法解决第二个测试用例。 有什么问题吗???

float pi=3.1416;是问题的原因。在数学头文件 (#include <math.h>) 下有一个常量 M_PI 用它代替。

编辑: 抱歉,没有仔细阅读,显然问题出在浮点精度上。如果将所有浮点值更改为双精度值,它应该可以工作。

#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;
}

与2和8不同,double更准确的原因是因为float不能代表3.1416以及输入值:

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

精度不够,(注意 IEEE-754 float, which is overwhelmingly used for float, stores it in base-2.) Most probably, the later numbers were probably specifically generated in order to fail the test cases. If one wants to know more, Don’t Store That in a Float, and What Every Computer Scientist Should Know About Floating-Point Arithmetic.

数值常数是 1.7168,假设他们的版本是 pi,这是准确的(乘以 r*r。)最好的一个可以用单-点精度为 1.7167999744415283203125,相差 2.55584716796875E-8。使用 double,它是 1.71680000000000010373923942097,关闭 1.0373923942097E-16,加上输入的值。