除了被零除之外,还都有哪些情况会发生浮点异常?
Posted
技术标签:
【中文标题】除了被零除之外,还都有哪些情况会发生浮点异常?【英文标题】:what are the cases when a floating point exception happens other than a divide by zero?除了被零除之外,还有哪些情况会发生浮点异常? 【发布时间】:2021-12-05 16:23:56 【问题描述】:我正在编写一些代码来通过称为 Luhn 算法的算法测试信用卡的校验和,并验证它是否是有效的卡号 我写的代码是编译好的程序但是当我输入它说浮点异常 我对何时调用浮点异常进行了一些阅读,但只有一种情况说当你除以零时会发生这种情况,但我的程序没有这样做 所以我想知道还有哪些其他情况会导致浮点异常。
#include <stdio.h>
int main(void)
int a = get_int("enter your card number:");
int x = 1 ;
int z ;
int y = 0 ;
int s = 0 ;
int d,k,m,g,h;
int c ;
int f = 1;
int p = 0;
bool checksum ;
int l ;
while ((a / (10^x) )> 1)
c = (a/10^x) ;
z= c % 10 ;
k = 2*z ;
if (k<10)
d = k;
else if (k>10||k==10)
d = (k%10) ;
y +=d;
x+=2;
x=p;
while ( (a / (10 ^ x) )>1 )
l= a/(10^x);
m = l % 10 ;
s += m;
x+=2;
g= s+y;
if(g%10==0)
checksum = 1 ;
printf("valid");
else
checksum = 0 ;
printf("invalid");
```
【问题讨论】:
'(10^x)' 向上箭头运算符不是指数。that it occurs when you divide by zero but my program does not do that
你怎么知道?当x = 10
时,a / (10 ^ x)
肯定看起来像除以 0。
'我的程序没有做到这一点',您应该通过在使用它之前将每个除数加载到临时变量中来备份该声明,然后打印临时文件或使用调试器检查价值。
(a) 在 C 中,^
是按位异或运算符。 (b) 当x
为10 时,x^10
为零,所以a / (10 ^ x)
除以零。 (c) 由于历史原因,在浮点异常信号下报告整数除零。 (d) 由于其他历史原因,浮点异常在很大程度上被抑制,并提供了替代结果(如 NaN)。例外情况包括无效运算(没有有用的可定义结果)、除以零、上溢(超出有限范围)、下溢(超出正常范围)和不精确(格式的有限精度不能代表理想的数学结果)。
@dxuian:其他语言有其他规则,^
在你之前的任何 C 程序中都没有执行幂运算。
【参考方案1】:
在我看来,您认为 x 的 10 次方在 C 中写为 10^x
,但与此相去甚远。 10^x
确实是 10 xor x(按位异或),而不是 到 运算符的幂。因此,如果 x
恰好是 10,您将得到 0
作为表达式的分母,并且您确实会被零除。
无论如何,我的想法是,如果您确实接受一串数字而不是整数,那么您可以更轻松地处理您的输入。由于整数的精度有限,使用int
将结束您将数字范围限制在 0 到 4,204,967,295 之间,而信用卡有 15 到 20 位数字,这可能会导致数字范围不足,无法处理单个卡号.
另一方面,如果你分析你的代码,你会发现你的程序中没有使用浮点数(既没有除法也没有任何其他操作)。这是因为整数除法产生与浮点除以零相同的异常。两者都发出相同的异常信号,尽管异常的原因。
【讨论】:
以上是关于除了被零除之外,还都有哪些情况会发生浮点异常?的主要内容,如果未能解决你的问题,请参考以下文章
C#中的异常处理是怎么回事?我刚开始学C#,请各位能够帮助我.谢谢!
Java 中除了 MDB 之外还都有哪些其他可能性来对消息消费者进行编程?