C中的无穷大
在本文中,我们将讨论 C 中的无穷大。我们将从对无穷大的一般性讨论开始。
接下来,我们将讨论无穷大作为 C 中的运行时错误,并以关于在 C 中存储和使用无穷大的讨论作为结尾。
什么是无穷大
我们都知道我们小学的数轴。 该数字线由没有结束或开始的箭头表示。
但是,理论上,我们两者都有。 这些数字终止于正无穷大(有时写为 +∞
),并从负无穷大 -∞
开始。
每个实数 x 都位于 – ∞ < x < ∞
之间。 无穷大是指一个数的重量超过任何可描述的极限。
当我们说我们有无限的数字时,这意味着我们有无穷无尽的数字。
我们都知道,当我们分割一个东西时,我们会得到实际东西的碎片或部分。 分隔线越小,我们拥有的部分就越多。
为了得到更多的碎片,我们必须把东西分成更小的碎片。 因此,如果我们划分接近于零的东西,我们会得到无限的部分(不可数的部分)。
相反,如果我们将任何实数除以无穷大,结果将是零,就像将有限的数量分配给无限的部分一样; 因此,每件作品将获得几乎为零的份额。
无限编程
通常,程序员对无穷大有一个典型的问题; 每当表达式中的除数为零(通常是错误的)时,程序就会崩溃(异常终止)。
对于生命攸关的软件来说,异常终止可能是一个严重的问题。 程序员从不希望异常终止; 因此,使用 if-else
检查,或执行异常处理。
考虑一个简单的代码:
#include <stdio.h>
int main() {
printf ("%d\n", 5 / 0);
printf ("\nEnd of program\n");
return 0;
}
在这个程序中,我们使用 5 和 0 的硬编码除法来检查程序的行为; 但是,在某些情况下,程序员可能会使用变量作为除法器,其值不知何故变为零。 我们已经在 Programiz C 在线编译器中试过了,输出结果如下。
Floating point exception
我们在另一个在线编译器中尝试了相同的代码,输出如下。
main.c: In function ‘main’:
main.c:3:23: warning: division by zero [-Wdiv-by-zero]
3 | printf ("%d\n", 5 / 0);
| ^
该程序在第一个打印语句处终止(崩溃)。 我们还有另一个打印语句,它没有被执行,因为程序已经终止(称为异常终止)。
C 中无穷大的表示
在 C 中,无穷大由 INF 或 inf 表示。 通常,它是除以零或空值的结果。
请参阅此示例代码:
#include <stdio.h>
#include <math.h>
double divide(double d1, double d2){
return d1 / d2;
}
int main() {
printf ("Result: %lf\n", divide(2,3));
printf ("Result: %lf\n", divide(2,0));
return 0;
}
代码中有两个打印语句。 我们在第一个 print
语句中使用非零参数调用该函数,而在第二个 print
调用中第二个参数为零。
输出:
Result: 0.666667
Result: inf
情况可能看起来类似于第一个代码; 但是,它略有不同。 在第一段代码中,我们在 print
语句中有一个表达式(除以零),因此程序异常终止。
但是,第二个程序从 main()
函数中调用了 divide
函数。 divide
函数返回 inf 作为 main
函数调用的结果,并相应地打印它。
如果我们将结果存储在主函数中的某个变量中,我们可以获得相同的结果。
#include <stdio.h>
#include <math.h>
double divide(double d1, double d2){
return d1 / d2;
}
int main() {
double result = divide(2,0);
printf ("Result: %lf\n", result);
return 0;
}
除了得到 inf 作为结果,我们还可以将结果与无穷大进行比较。 我们接下来的指令可能是基于表达式的值,很多情况需要在无限结果的情况下不继续。
因此,我们必须在执行下一条指令之前检查该值。
为此,我们有一个函数 isinf
来检查结果是否为无穷大。 看例子:
#include <stdio.h>
#include <math.h>
double divide(double x, double y){
return x / y;
}
int main(){
double res = divide(7, 3);
if (!isinf(res))
printf("Result is %lf\n", res);
else
printf("The result is infinity, and further computations not possible\n");
res = divide(7, 0);
if (!isinf(res))
printf("Result is %lf\n", res);
else
printf("The result is infinity, and further computations not possible\n");
return 0;
}
请注意我们将结果传递给 isinf 函数以将结果与无穷大进行比较的 if 语句。 如果 res 具有无限值,我们将跳过 printf 语句。
输出:
Result is 2.33333
The result is infinity, and further computations not possible
从输出中可以明显看出,在无限结果的情况下我们无法继续进行; 但是,该程序没有进行任何异常终止。 在任何情况下,程序员都可以保存任何需要的数据,可以写日志等。
C 中的负无穷大
我们在 C 中也有负无穷大。例如,如果我们将无穷大乘以一个负数,我们将在结果中得到负无穷大。
看这个简单的代码:
#include <stdio.h>
#include <math.h>
int main(){
double res = -1 * INFINITY;
printf("Result is %lf\n", res);
return 0;
}
此代码的输出是 Result is -inf
。 让我们看另一个例子来理解 -INFINITY
操作。
#include <stdio.h>
#include <math.h>
double divide(double x, double y){
return x / y;
}
int main(){
double res = divide(7, 3);
if (!isinf(res))
printf("Result is %lf\n", res);
else
printf("The result is infinity, and further computations not possible\n");
res = divide(-7, 0);
if (res != -INFINITY)
printf("Result is %lf\n", res);
else
printf("The result is negative infinity, and further computations not possible\n");
return 0;
}
在这里,对 divide
函数的第二个函数调用要求它用 0 除负数,从而返回等于负无穷大的值。
输出:
Result is 2.33333
The result is negative infinity, and further computations not possible
在本篇文章中,我们涵盖了这两个方面。 首先,我们讨论了在无限结果的情况下避免程序异常终止的方法。
之后,我们进一步研究了我们的程序如何进一步操纵无穷大来开发涉及无穷大值的条件表达式。
相关文章
在 C 语言中使用 typedef enum
发布时间:2023/05/07 浏览次数:181 分类:C语言
-
本文介绍了如何在 C 语言中使用 typedef enum。使用 enum 在 C 语言中定义命名整数常量 enum 关键字定义了一种叫做枚举的特殊类型。
C 语言中的 extern 关键字
发布时间:2023/05/07 浏览次数:114 分类:C语言
-
本文介绍了如何在 C 语言中使用 extern 关键字。C 语言中使用 extern 关键字来声明一个在其他文件中定义的变量
C 语言中的 #ifndef
发布时间:2023/05/07 浏览次数:186 分类:C语言
-
本文介绍了如何在 C 语言中使用 ifndef。在 C 语言中使用 ifndef 保护头文件不被多次包含 C 语言中的头文件用于定义同名源文件中实现的函数的接口。