C中浮动值混淆

Joh*_*ohn 3 c floating-point floating-point-conversion

我的代码是

void main()
{
    float a = 0.7;
    if (a < 0.7)
        printf("c");
    else
        printf("c++");
} 
Run Code Online (Sandbox Code Playgroud)

它打印C,这很好,a被视为双常数值,其值将0.699999小于0.7.

现在,如果我将值更改为" 0.1,0.2,0.3直到0.9" a并且if condition此时它还会打印C++,除此之外0.7 and 0.9,两者都相等或者更大.

为什么这个概念不考虑所有价值?

AnT*_*AnT 11

你在说什么"概念"?

您提到的数字都不能精确地以二进制浮点格式表示(无论精度如何).您提到的所有数字最终都会在点之后具有无限数量的二进制数字.

由于既不float也不double具有无限的精度,在floatdouble格式化的执行将表示这些值近似,最有可能通过一个最接近的可表示二进制浮点值.这些近似值对于float和将是不同的double.并且近似值float可能最终大于或小于近似值double.因此你观察到的结果.

例如,在我的实现中,值0.7表示为

+6.9999998807907104e-0001 - float
+6.9999999999999995e-0001 - double
Run Code Online (Sandbox Code Playgroud)

同时,价值0.1表示为

+1.0000000149011611e-0001 - float
+1.0000000000000000e-0001 - double
Run Code Online (Sandbox Code Playgroud)

如您所见,double表示float在第一个示例中大于表示,而在第二个示例中,表示则相反.(以上是十进制表示法,它们本身是四舍五入的,但它们确实有足够的精度来充分说明效果.)