C中浮动的行为

时间:2015-09-19 13:49:26

标签: 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

为什么以及如何在分配时截断而不是在比较时截断?

5 个答案:

答案 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的等效转换不相同。

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

答案 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,因此它有所不同。