提问人:Chen Liu 提问时间:9/7/2023 最后编辑:wohlstadChen Liu 更新时间:9/7/2023 访问量:84
为什么浮点型的double b=nextafter(0., 1.)是0.000000e+00?
Why double b=nextafter(0., 1.) is 0.000000e+00 for float type?
问:
我发现数据类型 double
和 float
的结果不一样。nextafter(0., 1.)
#include <math.h>
#include <stdio.h>
int main(){
double a;
float b;
a=nextafter(0., 1.);
b=nextafter(0., 1.);
printf("default %e\n",nextafter(0., 1.));
printf("double %e\n",a); //double 4.940656e-324
printf("float %e\n",b); //float 0.000000e+00
return 0;
}
为什么小于 0.0 的最小值是 0.000000e+00 ?float
答:
4赞
NoName
9/7/2023
#1
当您调用结果并将其存储在 中时,将发生隐式类型转换。该函数返回最小的正次正值,即 4.940656 x 10⁻³²⁴。然后将此值四舍五入为 ,但它太小,无法表示为 ,导致为零。nextafter(0., 1.)
float
double
float
float
要获得正确的结果,您应该使用:float
nextafterf(0.f, 1.f)
float b = nextafterf(0.f, 1.f);
这将为您提供最小的正亚正常值。float
1赞
wohlstad
9/7/2023
#2
nextafter
返回 a(在本例中为一个非常小的 a)。
当它转换为 赋值给 时,它将四舍五入为 。double
float
b
0
相反,您应该使用 nextafterf
,它是浮点
数的对应项:
#include <math.h>
#include <stdio.h>
int main() {
double a = nextafter (0., 1.);
float b = nextafterf(0.f, 1.f); // <---- here
printf("double %e\n", a);
printf("float %e\n", b);
return 0;
}
输出:
double 4.940656e-324
float 1.401298e-45
上一个:查找圆锥法线
评论
nextafter
返回一个非常小的 ,当它转换为 .您需要使用 .double
0
float
nextafterf