为什么浮点型的double b=nextafter(0., 1.)是0.000000e+00?

Why double b=nextafter(0., 1.) is 0.000000e+00 for float type?

提问人:Chen Liu 提问时间:9/7/2023 最后编辑:wohlstadChen Liu 更新时间:9/7/2023 访问量:84

问:

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

c 数学 cmath

评论

2赞 wohlstad 9/7/2023
nextafter返回一个非常小的 ,当它转换为 .您需要使用 .double0floatnextafterf

答:

4赞 NoName 9/7/2023 #1

当您调用结果并将其存储在 中时,将发生隐式类型转换。该函数返回最小的正次正值,即 4.940656 x 10⁻³²⁴。然后将此值四舍五入为 ,但它太小,无法表示为 ,导致为零。nextafter(0., 1.)floatdoublefloatfloat

要获得正确的结果,您应该使用:floatnextafterf(0.f, 1.f)

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

这将为您提供最小的正亚正常值。float

1赞 wohlstad 9/7/2023 #2

nextafter 返回 a(在本例中为一个非常小的 a)。
当它转换为 赋值给 时,它将四舍五入为 。
doublefloatb0

相反,您应该使用 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