【发布时间】:2021-11-06 12:16:45
【问题描述】:
我是 C 新手,我的任务是创建一个函数
f(x) = sqrt[(x^2)+1]-1
它可以处理非常大的数字和非常小的数字。我正在在线界面上提交我的脚本以检查我的答案。
对于非常大的数字,我将表达式简化为:
f(x) = x-1
只需使用最高功率。这是正确的答案。
同样的逻辑不适用于较小的数字。对于小数(大约 1e-7),它们会很快被截断为零,甚至在平方之前。我怀疑这与 C 中的浮点精度有关。在我的教科书中,它说浮点类型的最小可能值为 1.17549e-38,精度为 6 位。所以虽然 1e-7 比 1.17e-38 大很多,但它的精度更高,因此四舍五入为零。这是我的猜测,如果我错了,请纠正我。
作为一种解决方案,我认为当 x
#include <math.h>
#include <stdio.h>
double feval(double x) {
/* Insert your code here */
if (x > 1e299)
{;
return x-1;
}
if (x < 1e-6)
{
long double g;
g = x;
printf("x = %Lf\n", g);
long double a;
a = pow(x,2);
printf("x squared = %Lf\n", a);
return sqrt(g*g+1.)- 1.;
}
else
{
printf("x = %f\n", x);
printf("Used third \n");
return sqrt(pow(x,2)+1.)-1;
}
}
int main(void)
{
double x;
printf("Input: ");
scanf("%lf", &x);
double b;
b = feval(x);
printf("%f\n", b);
return 0;
}
【问题讨论】:
-
请注意,
pow返回一个double。事后将其转换为long double不会改变这一点。如果结果不适合double,它将溢出。如果你想要long double结果,那么你需要使用powl来代替。
标签: c floating-point underflow