2

我用 C 语言编写了一个程序,当我比较 float 和使用函数 atof 转换为 float 的字符串的相同值时,结果 NOT EQUAL 。

    #include<stdio.h>

    main(){

            char str[10] = "54.23" ;
            float val = 54.23 ;


            if( atof(str) == val )
                 printf("\nconverted correctly");
            else
                 printf("\nThen What is the use of atof\n ");


       }

这个程序正在显示输出:“那么 atof 有什么用” 请告诉我为什么这个程序会显示这种匿名行为?

4

4 回答 4

5

永远不要测试浮点数/双精度数是否相等==

这是您的代码的一个版本,它实际上显示了有问题的值:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char str[10] = "54.23";
    float val = 54.23;

    printf("atof(str) = %.15f\n", atof(str));
    printf("      val = %.15f\n", val);

    return 0;
}

当你运行它时,你会看到:

$ gcc -Wall atof.c
$ ./a.out 
atof(str) = 54.229999999999997
      val = 54.229999542236328
$

这些值很接近,在单精度浮点数的预期精度范围内,但它们并不相同。此外,正如其他人所指出的那样,atof返回 a double,因此您将 afloat提升的值与 a返回double的完整精度进行比较。doubleatof

与此类问题一样,请先阅读内容,然后再进一步处理代码中的浮点运算。“带回家的信息”是您永远不应该将浮点数或双精度数与==- 始终将绝对差异与适当的容差值进行比较。

于 2012-08-05T07:28:05.210 回答
2

因为val是一个int;当您分配它时,54.23它将被截断为 54。并且 54 != 54.23。

即使它是一个浮点数,你也不能指望它们是平等的。这就是为什么。

于 2012-08-05T07:04:56.910 回答
1
double atof(char *str);\\it return double not a float

这种比较是在浮点数和双精度数之间进行的。当您在两种不同类型之间进行比较时,您可能会得到一些意想不到的输出。因为每种数据类型具有不同的内存表示以及不同的访问机制。

与 double 相比, float 以不同的形式在内存中表示。

您也可以在维基百科中了解更多信息

http://en.wikipedia.org/wiki/Floating_point#Internal_representation

您应该再次包含头文件

#include <stdlib.h> \\prototype of atof() present in this header.

如果您在使用该功能之前没有提供正确的原型,那么

默认情况下返回函数的类型 int 。所以我认为返回结果肯定与您预期的不同。

于 2012-08-08T03:49:52.767 回答
0

你几乎不想用浮点数检查相等性,因为微小的差异将被解读为不相等。还有其他问题。例如,即使使用双精度,十进制数“0.1”也表示为“0.10000000000000001”。

在这种情况下,您的“val”变量是一个双精度文字,它被转换为浮点数。结果可能不会完全准确。其次,您的字符串文字需要从以 10 为底的转换为以 2 为底的双精度。因此,要将 atof 值与您的文字进行比较,atof 将一个以十为底的字符串转换为以二为底的双精度,而“val”从以十为底的文字转换为以二为底的双精度为以二为底的浮点数,然后向上转换一个基数二双做比较。

事实上,我不会确切地确定丢失的精确度去了哪里。按照 Paul 的代码可能建议的方式进行操作,并将这些值与容差范围内的值进行比较。

于 2012-08-05T07:30:33.300 回答