[英]behaviour of float in C
#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
為什么以及如何在分配時截斷而不是在比較時截斷?
沒有后綴的浮點文字是double
類型。 使用f
進行后綴使得文字類型為float
。
分配給變量時, =
的右操作數將轉換為左操作數的類型,因此您會觀察到截斷。
比較時, ==
的操作數轉換為兩個操作數中的較大者,因此x == 0.1
就像(double)x == 0.1
,這是假的,因為(double)(float)0.1
不等於0.1
到期四舍五入的問題。 在x == 0.1f
,兩個操作數都具有float
類型,這會導致計算機上的相等性。
浮點數學很棘手,請閱讀標准了解更多細節。
0.1f(數字后面的“f”)是計算機浮動的,你的分析師知道他需要將它存儲為浮動而不是雙重。 所以浮點數0.1不等於0.1,等於0.1f
除非指定為0.1f
的浮點數,否則像0.1
這樣的浮點常數是double。 這條線
float f = 0.1;
表示創建一個值為0.1的double並將其轉換為float並在此過程中失去精度。 線條
float x = 0.1;
if (x == 0.1)
將導致x被隱式轉換為double,但它的值將略微不同於例如double x = 0.1;
當你寫0.1
,它默認被認為是double
。 后綴f
顯式使其浮動。
在第二個問題中浮點數被存儲為ieee標准,所以else if
因為0.1f到double的等效轉換不相同,它就會進入else if
。
0.1
是雙值,而0.1f
是浮點值。 我們可以寫float x=0.1
以及double x=0.1
的原因是由於隱式轉換。
但是通過使用后綴f
你可以使它成為浮點類型。
在這 -
if(x == 0.1)
因為0.1
在十進制之后的某些地方不完全是0.1
,所以它也是flase。這里也有轉換為更高的類型,即double
。
轉換為float
然后再轉換為double
,信息丟失也是float
double
,因此它不同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.