C中浮动值混淆

时间:2012-09-06 17:44:13

标签: c floating-point floating-point-conversion

我的代码是

void main()
{
    float a = 0.7;
    if (a < 0.7)
        printf("c");
    else
        printf("c++");
} 

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

现在,如果我将0.1,0.2,0.3中的值更改为0.9中的a以及if condition,那么除了C++之外,它还会打印0.7 and 0.9这意味着两者都相等或者更大。

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

1 个答案:

答案 0 :(得分:11)

你在说什么“概念”?

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

由于floatdouble都不具有无限精度,因此floatdouble格式的实现将代表大约这些值,很可能通过最近的可表示的二进制浮点值。 floatdouble的这些近似值会有所不同。并且近似float值可能最终大于或小于近似double值。因此,您观察到的结果。

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

+6.9999998807907104e-0001 - float
+6.9999999999999995e-0001 - double

同时0.1的值表示为

+1.0000000149011611e-0001 - float
+1.0000000000000000e-0001 - double

正如您所看到的,double表示在第一个示例中大于float表示,而在第二个示例中,它是另一种方式。 (以上是十进制表示法,它们本身是四舍五入的,但是它们有足够的精度来充分说明效果。)