如何在其中有 2 个圆圈的矩形中找到空 space?
How to find empty space in a rectangle which has 2 circles in it?
我正在 Toph 中解决一个问题。在这个问题中,我必须找出一个矩形的空 space,其中有 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;
这是我的解决方案。它 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
,加上输入的值。
我正在 Toph 中解决一个问题。在这个问题中,我必须找出一个矩形的空 space,其中有 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;
这是我的解决方案。它 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
,加上输入的值。