C语言 为什么float类型的double b=nextafter(0.,1.)是0.00000e +00?

kse8i1jr  于 2023-10-16  发布在  其他
关注(0)|答案(2)|浏览(127)

我发现数据类型为**doublefloat**的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的最小float是0.00000e +00?

cwtwac6a

cwtwac6a1#

当您调用nextafter(0., 1.)并将结果存储在float中时,会发生隐式类型转换。该函数返回最小的正次法线double,即4.940656 x 10立方²。然后将该值四舍五入为float,但它太小而不能表示为float,从而导致零。
要获得正确的float结果,您应该使用nextafterf(0.f, 1.f)

float b = nextafterf(0.f, 1.f);

这将给予最小的正次法线float

e4yzc0pl

e4yzc0pl2#

nextafter返回一个double(在本例中是一个非常小的值)。
当它被转换为float以分配给b时,它被舍入为0
相反,您应该使用**nextafterf,它是float**的对应项:

#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

相关问题