oua*_*uah 15
正如其他人所说,一个字面是类型float而另一个是类型double.这是一个有所作为的例子:
#include <stdio.h>
int main(void)
{
int a = 16777217 * 1.0f;
int b = 16777217 * 1.0;
printf("%d %d\n", a, b);
}
Run Code Online (Sandbox Code Playgroud)
在我的机器上打印:
16777216 16777217
Run Code Online (Sandbox Code Playgroud)
表达式16777217 * 1.0f是类型的float,16777217不能精确地表示在float(在IEEE-754中),而它可以精确地表示在a中double.
一个是double另一个是float:
double x = 0.0; // denotes a double
float y = 0.0f; // denotes a float
Run Code Online (Sandbox Code Playgroud)
这取决于系统,但在Windows上你会发现它float具有32位精度而double64位.当涉及精确或可数字的不稳定计算时,这可以产生巨大的差异.
我们不能写浮点y = 0.0
从您的评论中,我看到了混乱的根源。在这里,重要的不是分配给变量的数据类型,而是文字常量(0.0、1.0f,1.0等)本身的数据类型。当你写
float f = 1.0;
Run Code Online (Sandbox Code Playgroud)
1.0类型的文字double,同时f是一个float,因此,编译器执行一个隐含的收缩转换到float,这同样适用于真double d = 1.0f在那里它从扩大的隐式转换float到double。
隐式转换规则是16777217 * 1.0f表达式(在ouah的回答中)成为a的原因float,因为1.0fa是a,float并且在具有两者的表达式中,float并且int结果类型由标准规定为a float,因此两者都转换为floats,但是结果值不是不能表示为a float,因此您会看到不同的值。
取而代之的1.0f是,将when 更改为1.0a double,从而使16777217 * 1.0表达式变为a double(同样,因为该标准指示在具有double和任何其他整数类型的表达式中,结果为a double),足以容纳该值16777217。