NaN,是Not a Number的缩写。
NaN 用于处理计算中出现的错误情况,比如 0.0 除以 0.0 或者求负数的平方根。由上面的表中可以看出,对于单精度浮点数,NaN 表示为指数为 emax + 1 = 128(指数域全为 1),且尾数域不等于零的浮点数。IEEE 标准没有要求具体的尾数域,所以 NaN 实际上不是一个,而是一族。不同的实现可以自由选择尾 数域的值来表达 NaN,比如 Java 中的常量 Float.NaN 的浮点数可能表达为01111111110000000000000000000000,其中尾数域的第一位为 1,其余均为 0(不计隐藏的一位),但这取决系统的硬件架构。
本题中由于左右边界设置过大,导致计算出R<r,故sqrt(负值)为nan。
#include<cstdio>
#include<cmath>
#include<algorithm>
#define eps 10e-6
#define pi acos(-1.0)
using namespace std;
double S;
double cal(double r)
{
double R=S/pi/r-r;
double h=sqrt(R*R-r*r);
return h*pi*r*r/3;
}
int main()
{
while(scanf("%lf",&S)!=EOF)
{
double l=0,r=sqrt(S/pi);
double mid,mmid;
while(l+eps<r)
{
mid=l+(r-l)/3;
mmid=r-(r-l)/3;
/*
mid=(l+r)/2.0;
mmid=(mid+r)/2.0;//不存在以该底半径且表面积为S的圆锥
*/
if(cal(mid)>cal(mmid))
r=mmid;
else
l=mid;
}
double R=S/pi/r-r;
double h=sqrt(R*R-r*r);
double V=h*pi*r*r/3;
printf("%.2f\n%.2f\n%.2f\n",V,h,r);
}
return 0;
}
|