簡體   English   中英

C中浮動的行為

[英]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 float8 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

https://en.wikipedia.org/wiki/Floating_point

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM