C语言之判断浮点数

目录

一 简介

二 代码实现

A.方法一

B.方法二

二 时空复杂度

A.方法一

B.方法二


一 简介

在C语言中,判断浮点数的算法通常涉及到比较两个浮点数是否相等或比较它们的大小。由于浮点数运算存在精度误差问题,直接使用 ==!= 进行比较可能会导致不准确的结果。因此,一般采用近似比较方法来判断浮点数的相等性或大小关系。

二 代码实现

A.方法一

以下是一个简单的示例,用于判断一个浮点数是否接近于零:

#include <stdio.h>
#include <math.h> // 需要包含这个头文件以使用fabs函数

bool isZero(double x, double epsilon) {
    return fabs(x) < epsilon;
}

int main() {
    double num = 0.000001;
    double epsilon = 1e-6; // 定义一个足够小的阈值

    if (isZero(num, epsilon)) {
        printf("%f 可以认为是近似为0的浮点数\n", num);
    } else {
        printf("%f 不是近似为0的浮点数\n", num);
    }

    return 0;
}

B.方法二

对于比较两个浮点数的大小,也可以采取类似的策略,通过计算两个数之差的绝对值与一个很小的阈值(epsilon)进行比较:

#define EPSILON 1e-7 // 设置一个精度阈值

bool areAlmostEqual(double a, double b) {
    return fabs(a - b) < EPSILON;
}

bool isFirstLessThanSecond(double a, double b) {
    return a < b && fabs(a - b) > EPSILON;
}

bool isFirstGreaterThanSecond(double a, double b) {
    return a > b && fabs(a - b) > EPSILON;
}

// 在main函数中使用上述函数进行浮点数比较

当然,在实际应用中,选择合适的阈值(epsilon)是非常重要的,它应该根据具体应用场景和浮点数的精度要求来确定。此外,当需要处理特殊情况,例如判断浮点数是否为NaN(非数字)或无穷大时,可以使用标准库提供的函数如 isnan() 和 isinf()。

二 时空复杂度

A.方法一

该算法实现了一个名为 isZero 的函数,用于判断一个浮点数是否近似为零。在给出的代码中:

  • 时间复杂度:isZero 函数的时间复杂度是 O(1) 或常数时间复杂度。这是因为调用 fabs 函数计算绝对值并进行比较的操作次数固定,不随输入参数 xepsilon 的大小变化而变化。

  • 空间复杂度:同样地,该算法的空间复杂度也是 O(1)。它没有使用与输入规模相关的额外空间,仅涉及了临时存储变量 xepsilon,以及调用 fabs 函数时可能需要的内部临时变量,但这些都属于固定开销,不会随着输入数据量增大而增加。

因此,这个算法在时间和空间上的资源消耗都是恒定的,非常高效。

B.方法二

该算法实现了三个函数,用于判断两个浮点数是否近似相等、第一个数是否小于第二个数(且两者不相等)以及第一个数是否大于第二个数(且两者不相等)。对于每个函数的时间复杂度和空间复杂度:

  • 时间复杂度:每个函数的时间复杂度都是 O(1) 或常数时间复杂度。这是因为无论输入的浮点数 ab 的值如何,都需要执行一次减法运算(a - b),一次绝对值函数调用(fabs(a - b)),以及一到两次比较操作。这些操作次数固定不变。

  • 空间复杂度:同样地,这三个函数的空间复杂度也都是 O(1)。它们在运行过程中没有使用与输入规模相关的额外存储空间,仅涉及了临时存储变量 ab 以及调用 fabs 函数时可能需要的内部临时变量,但这些都属于固定开销,并不会随着输入数据量增大而增加。

总结来说,这三个函数在时间和空间上的资源消耗都很小,具有较高的效率,适合进行浮点数的近似比较。