📜  C++ 浮点运算(1)

📅  最后修改于: 2023-12-03 14:39:55.695000             🧑  作者: Mango

C++浮点运算

在C++中,浮点数(float和double)是一种用于表示具有小数点的数字的数据类型。这些数字可以表示10进制,例如:3.14或1.2E7。在本文中,我们将探讨C++中的浮点数运算及其相关的问题。

浮点数精度

由于计算机内部使用二进制表示浮点数,因此一些数字在浮点数中可能无法精确表示。例如,0.1在二进制中无法准确表示并且将被近似为:

0.0001100110011001100110011001100110011001100110011(无限循环)

由于计算机存储空间的限制,浮点数精度最多只能达到15到16位有效数字。这意味着在执行浮点数计算时,可能会出现精度损失的情况。

考虑下面的代码:

double a = 0.1;
double b = 0.2;
double c = a + b;
printf("%.20f\n", c);

该代码的输出为:

0.30000000000000004441

我们可以看到,结果并不是预期的0.3,而是一个略微偏离的数字。这是由于浮点数精度的实现方式导致的。在实际应用中,需要注意浮点数的精度问题,避免出现错误的计算结果。

浮点数比较

由于浮点数的精度问题,浮点数的比较也需要特别注意。例如,考虑下面的代码:

double a = 0.1;
double b = 0.2;
double c = 0.3;
if (a + b == c) {
    printf("Equal\n");
} else {
    printf("Not equal\n");
}

输出将为“Not equal”,这是由于a+b和c并不相等。在进行浮点数比较时,通常可以使用类似以下的方法:

double eps = 1e-9; // 可以根据实际情况调整eps的值
if(fabs(a+b-c) < eps) {
    printf("Equal\n");
} else {
    printf("Not equal\n");
}

该代码将输出“Equal”。在实际应用中,需要根据具体情况选择合适的精度值。

特殊值

浮点数还包含一些特殊值,例如NaN(非数字)和Infinity(正无穷大、负无穷大)。NaN通常表示一些无法计算的结果,例如0/0。Infinity表示一个超出了表示范围的值,它可以通过除以0获得。特殊值可以使用库函数isnan()和isinf()进行检测。

#include <cmath>

double a = sqrt(-1);
if (isnan(a)) {
    printf("a is NaN\n");
}

double b = 1.0 / 0.0;
if (isinf(b)) {
    printf("b is Inf\n");
}

输出将为“a is NaN”和“b is Inf”。需要注意的是,在进行浮点数运算时,可能会出现NaN和Inf,因此需要对它们进行特殊处理。

总结

本文介绍了C++中的浮点数运算以及相关的问题,包括浮点数精度、浮点数比较和特殊值。在实际应用中,需要注意浮点数的精度问题,并注意特殊值的处理。