首页 > 编程知识 正文

c语言电话面试题(c语言数据类型)

时间:2023-05-05 11:41:21 阅读:87422 作者:4626

在一些C/C语言的基础知识调查中,经常会遇到这样的问题:给定两个浮点数,如何判断它们是否相等?

今天讨论这个问题,从程序的实验结果分析这个问题的正确处理方法。

我们知道在c语言中可以使用比较运算符==来比较两个数字是否相等。 例如,对于两个整数a和b,可以使用if(a==b )进行判断。 例如,以下程序。

整数比较

从程序和执行结果可以看出,对于整数,比较运算符可以正确地给出比较结果。 那么,如果a和b变成浮点数,可以这样使用吗?

让我们从程序及其运行结果来分析一下。 让我们先看看a和b相等的情况。

浮点数相等的比较

从执行结果可以看出,a、b相等时,比较操作员可以得到正确的结果。

接下来,让我们看看a、b不相等,但值相近的情况。 程序和执行结果如下。

浮点数接近会产生错误的结果

在这个小程序中,c=a b,a、b都不为0,所以从数学意义上来说a和c不相等,但是程序的执行结果显示a、b相等。 为什么会这样呢? 高精度地输出a、b的值,看看有什么神秘。 请看以下程序及其执行结果。

高精度地输出浮点数值

可以看出,虽然a和c在数学上不相等,但由于计算机的记忆内存相等,所以计算机在比较时得到了相等的结果。

为了进一步说明这个问题,让我们看看数字在计算机中的存储方法。 我们知道计算机以二进制形式存储数据的内容。 整数可以精确地转换为一个二进制数,因此可以精确地保存内容,但小数不能使用这种方式。 为了在计算机中保存小数,发明了浮点数。 这个表示法是以适当的形式将比例因子表示在数据中,并根据需要浮动小数点的位置,类似于数学中的科学计数法。 这样,在位数有限的情况下,一边扩大数字的显示范围,一边维持有效精度。

浮点数主要由符号、步码和尾数三部分组成。 请参照下图。 由32位和64位浮点组成。

浮点数的基本构成

有关浮点数的具体存储格式以及将小数转换为二进制浮点数的方法,请参见以下标准:

二进制浮点运算标准(IEEE Std 754-1985 )也称为IEC 50599:1989,后来被ISO收录,因此也称为IOS/IEC/IEEE 60559:2011。 与基数无关的浮点数的算术标准(IEEE Std 854-1987 )。 关于浮点数的存储和运算内容,超出了本论文讨论的范围,有兴趣的请参考相关标准的官方文档。

因为知道了浮点数有精度问题,所以上面的程序出现不正确的结果也不奇怪。 那么,回到本文开头的问题,我们该如何比较两个浮点数呢? 根据近似相等,即程序的实际情况,定义一个精度值,如果两个浮点数之差的绝对值小于该值,则可以认为它们相等,对于不相等也可以使用同样的方法。

但是,这里引出另一个问题。 用户可以定义精度值,但为了提高精度,可以尽量减小该值吗? 显然不可能,但最小的精度是多少? 实际上,为了便于进行浮点数的运算,标准库中提供了float.h文件,其中定义了宏DBL_EPSILON等辅助宏,用宏FLT_EPSILON表示单精度浮点数的最高精度,或表示双精度浮点数

最后给出了规范化浮点数值比较的函数。

浮点数的正确比较方法

本人水平有限,如文中有不足之处,欢迎大家指正。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。