将float转换为float / int后返回不同的结果

时间:2016-03-25 15:54:18

标签: c++ c types casting

在原始代码中,

approach += sign * (1.0/n);

但是在向它添加浮动演员之后:

approach += sign * (float)(1.0/n);

最终结果发生了变化。 approach定义为floatsignnintegers。  根据我所学到的,1.0 / n应该将n转换为浮动,而在第一个版本中它应该等同于

approach += sign * (1.0/(float)n);

(1.0/(float)n)本身就是一个浮动,向它投射一个浮动不应该有任何区别。 我的逻辑显然有些不对劲,请指出。

1 个答案:

答案 0 :(得分:1)

1.0/n应该n不是float而是double,因为1.0double

(1.0/(float)n)不是float,而是double,因为1.0double(float)n会被提升为double之前计算

您可以1.0f/n使用float文字1.0ff作为后缀)将n投放到float并执行计算。

使用此代码,如果环境中floatdouble的大小不同,您可以看到(float)(1.0/n)(1.0/(float)n)的大小不同。

#include <stdio.h>

int main(void) {
    float approach, init = 3.14;
    int sign = 1, n = 10;

    printf("sizeof(float) = %zu\n", sizeof(float));
    printf("sizeof(double) = %zu\n", sizeof(double));
    printf("sizeof(long double) = %zu\n", sizeof(long double));
    printf("sizeof((1.0/n)) = %zu\n", sizeof((1.0/n)));
    printf("sizeof((1.0f/n)) = %zu\n", sizeof((1.0f/n)));
    printf("sizeof((float)(1.0/n)) = %zu\n", sizeof((float)(1.0/n)));
    printf("sizeof((1.0/(float)n)) = %zu\n", sizeof((1.0/(float)n)));

    approach = init;
    approach += sign * (1.0/n);
    printf("(1.0/n) : %.30f\n", approach);
    approach = init;
    approach += sign * (1.0f/n);
    printf("(1.0f/n) : %.30f\n", approach);
    approach = init;
    approach += sign * (float)(1.0/n);
    printf("(float)(1.0/n) : %.30f\n", approach);
    approach = init;
    approach += sign * (1.0/(float)n);
    printf("(1.0/(float)n) : %.30f\n", approach);
    return 0;
}
相关问题