#include<stdio.h>
int main()
{
float f = 0.1;
double d = 0.1;
printf("%lu %lu %lu %lu\n", sizeof(f), sizeof(0.1f), sizeof(0.1), sizeof(d));
return 0;
}
输出
$ ./a.out
4 4 8 8
根据上面的代码,我们可以看到sizeof(0.1)
和sizeof(0.1f)
不相同。
sizeof(0.1) is 8 bytes
,而sizeof(0.1f) is 4 bytes
。
但在分配value to float variable f
时,它会自动将其大小截断为4 bytes
。
虽然在下面的代码中,在将其与float x进行比较时,它不会截断,4 bytes of float
与8 bytes of 0.1
进行比较,float x
的值与0.1f
匹配,因为两者都是4个字节。
#include<stdio.h>
int main()
{
float x = 0.1;
if (x == 0.1)
printf("IF");
else if (x == 0.1f)
printf("ELSE IF");
else
printf("ELSE");
}
输出
$ ./a.out
ELSE IF
为什么以及如何在分配时截断而不是在比较时截断?
答案 0 :(得分:8)
没有后缀的浮点文字属于double
类型。如果使用f
后缀,则会生成float
类型的文字。
分配给变量时,=
的右操作数将转换为左操作数的类型,因此您会观察到截断。
比较时,==
的操作数将转换为两个操作数中较大的一个,因此x == 0.1
与(double)x == 0.1
类似,由于(double)(float)0.1
不相等,因此为{}}由于四舍五入问题导致0.1
。在x == 0.1f
中,两个操作数都具有类型float
,这会导致您的计算机上相等。
浮点数学很棘手,请阅读标准以获取更多详细信息。
答案 1 :(得分:2)
0.1f(&#34; f&#34;在数字之后)是计算机作为浮点数,你的分析师知道他需要将它存储为浮点而不是双倍。 所以浮点数0.1不等于0.1,等于0.1f
答案 2 :(得分:2)
像0.1f
这样的浮点常量是double,除非指定为float f = 0.1;
之类的浮点数。这条线
float x = 0.1;
if (x == 0.1)
表示创建一个值为0.1的double,并将其转换为float并在此过程中失去精度。行
double x = 0.1;
将导致x被隐式转换为double,但它的值将略微不同于例如。 Noun N
Plural p
Noun Phrase h
Verb (usu participle) V
Verb (transitive) t
Verb (intransitive) i
Adjective A
Adverb v
Conjunction C
Preposition P
Interjection !
Pronoun r
Definite Article D
Indefinite Article I
Nominative o
答案 3 :(得分:1)
当您撰写0.1
时,默认情况下会将其视为double
。后缀f
明确地使其浮动。
在第二个问题中,浮点数存储为 ieee standard ,因此它会进入else if
,因为0.1f到double的等效转换不相同。
答案 4 :(得分:1)
0.1
是一个double值,而0.1f
是一个浮点值。
我们可以编写float x=0.1
以及double x=0.1
的原因是隐式转换。
但是使用后缀f
可以使它成为浮点类型。
在此 -
if(x == 0.1)
是flase,因为0.1
在十进制之后的某些地方并不完全是0.1
。此处也转换为更高类型,即double
。
转换为float
然后转换为double
,信息丢失以及double
的进动速度高于float
,因此它有所不同。