在原始代码中,
approach += sign * (1.0/n);
但是在向它添加浮动演员之后:
approach += sign * (float)(1.0/n);
最终结果发生了变化。 approach
定义为float
,sign
和n
为integers
。
根据我所学到的,1.0 / n应该将n
转换为浮动,而在第一个版本中它应该等同于
approach += sign * (1.0/(float)n);
和(1.0/(float)n)
本身就是一个浮动,向它投射一个浮动不应该有任何区别。
我的逻辑显然有些不对劲,请指出。
答案 0 :(得分:1)
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;
}