C编程 - 浮点条件的while循环的异常行为

时间:2017-01-09 02:59:44

标签: c while-loop floating-point

我写了以下代码:

#include <stdio.h>

int main ()
{
  float x = 1.1;
  printf("%s\n", "Hello!");
  while (x == 1.1)
  {
    printf("%s\n", "Hey there!");
    printf("%f\n", x);
    x = x - 0.1;
  }
  printf("%s\n", "Bye!");
  return 0;
}

然而输出是(我认为不是预期的):

aps120797@XENON-PC:/mnt/d/Codes/LetUsC$ gcc C04Ag.c
aps120797@XENON-PC:/mnt/d/Codes/LetUsC$ ./a.out
Hello!
Bye!

为了检查它是否接受浮动条件,我写了这段代码:

#include <stdio.h>

int main ()
{
  float x = 1.1;
  printf("%s\n", "Hello!");
  while (x >= 1.0)
  {
    printf("%s\n", "Hey there!");
    printf("%f\n", x);
    x = x - 0.1;
  }
  printf("%s\n", "Bye!");
  return 0;
}

我按照预期得到了输出。

aps120797@XENON-PC:/mnt/d/Codes/LetUsC$ gcc C04Ag.c
aps120797@XENON-PC:/mnt/d/Codes/LetUsC$ ./a.out
Hello!
Hey there!
1.100000
Hey there!
1.000000
Bye!

所以,我的问题是,我在第一段代码中做错了什么

UPDTATE :刚想出如何纠正此错误。 像这样附加while条件:while (x == 1.1f)

1 个答案:

答案 0 :(得分:1)

1.1不是float值,而是double值。

当您编写float x = 1.1;时,编译器会插入隐式强制转换:float x = (float)1.1;

当您编写x == 1.1时,编译器会插入另一个隐式转换:(double)x == 1.1

因此,您有效地测试1.1在将其转换为float并返回double之后是否仍然是相同的值 - 即(double)(float)1.1 == 1.1是否为真。

由于浮点舍入错误,

(double)(float)1.1 == 1.1不正确。至少在我的平台上:

  • 1.1实际上是1.100000000000000088817841970012523233890533447265625
  • (double)(float)1.1实际上是1.10000002384185791015625

正如您所看到的,这两个数字并不相同。