解释这个浮点行为

Baz*_*oka 1 c floating-point

请解释为什么以下代码片段的行为不同.

#include<stdio.h>
int main(){
 float a=0.1;
 if(a<0.1)
  printf("less");
 else 
  printf("greater than equal");
getchar();
}
Run Code Online (Sandbox Code Playgroud)

Output:greater than equal

 #include<stdio.h>
 int main(){
 float a=0.7;
 if(a<0.7)
  printf("less");
 else 
  printf("greater than equal");
getchar();
}
Run Code Online (Sandbox Code Playgroud)

Output:less 与我的预期相反.

PS:这不是功课.

Jon*_*eet 10

这里涉及两种不同的类型:floatdouble.你分配给a float,然后比较 a double.

试想一下,floatdouble实际上是2和4位十进制浮点类型来代替.现在想象你有:

float a = 0.567123 // Actually assigns 0.57
if (a < 0.567123) // Actually compares 0.5700 with 0.5671
{
    // We won't get in here
}

float a = 0.123412; // Actually assigns 0.12
if (a < 0.123412) // Actually compares 0.1200 with 0.1234
{
    // We will get in here
}
Run Code Online (Sandbox Code Playgroud)

显然这是对正在发生的事情的近似,但它解释了两种不同的结果.

这很难说,你什么应该没有更多的信息可以做的-很可能是你不应该使用float,并double在所有的,或者说你应该用宽容的一些水平比较,或者你应该使用double无处不在,还是应该接受某种程度的"不准确"只是系统工作方式的一部分.