在我的原始代码中,它是,
approach += sign * (1.0/n);
但在添加 float 转换后:
approach += sign * (float)(1.0/n);
最终结果发生了变化。 approach
被定义为 float
,而 sign
和 n
被定义为 integers
。
据我所知,1.0/n 应该将 n
转换为 float,在第一个版本中它应该相当于
approach += sign * (1.0/(float)n);
和 (1.0/(float)n)
本身就是一个 float ,将 float 转换为它应该不会有任何区别。
显然我的逻辑有问题,请指出。
最佳答案
1.0/n
不应将 n
转换为 float
,而是转换为 double
,因为 1.0
是 double
。
(1.0/(float)n)
不是 float
而是 double
因为 1.0
是 double
和 (float)n
在计算之前将提升为 double
。
您可以将 1.0f/n
与 float
文字 1.0f
(以 f
作为后缀)一起使用来将 n
转换为 float
并进行计算。
通过这段代码,如果环境中float
和double
的大小不同,你可以看到(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;
}
关于c++ - 将 float 转换为 float/int 后返回不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36223310/