我发现数据类型为**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的最小float
是0.00000e +00?
2条答案
按热度按时间cwtwac6a1#
当您调用
nextafter(0., 1.)
并将结果存储在float
中时,会发生隐式类型转换。该函数返回最小的正次法线double
,即4.940656 x 10立方²。然后将该值四舍五入为float
,但它太小而不能表示为float
,从而导致零。要获得正确的
float
结果,您应该使用nextafterf(0.f, 1.f)
:这将给予最小的正次法线
float
。e4yzc0pl2#
nextafter
返回一个double
(在本例中是一个非常小的值)。当它被转换为
float
以分配给b
时,它被舍入为0
。相反,您应该使用**
nextafterf
,它是float
**的对应项:输出量: