为什么会出现浮点异常 8?
Why do I get floating point exception 8?
对于我的介绍。编程考试复习 我被要求编写一个程序,该程序使用一个函数来计算一组数字的 gcd。我写了下面的代码,有时似乎工作正常,但其他人 returns 浮点异常 8。我希望有人能阐明一些问题。
我在 mac 终端上使用 clang gcd.c -o gcd
使用 macOS High Sierra 和 return FP 错误的数字 5372 18960 -230048 1185 16486
这是代码:
#include <stdio.h>
#include <stdlib.h>
int gcd(int a, int b){
if((a==0) || (b==0)){
return 0;
}else{
if( a % b == 0 ){
return b;
}else{
if ( b % a == 0 ){
return a;
}
}
}
while( (a != 0) && (b != 0) ){
if (abs(a)>abs(b)){
a = abs(a) % abs(b);
}
if(b>a){
b = abs(b) % abs(a);
}
}
if (a == 0){
return b;
}else{
return a;
}
}
int main(void){
int n;
printf("Please enter the number of integers in your array:\n");
scanf("%d", &n);
int a[n];
printf("Please enter the numbers in your arrray:\n");
for (int i = 0; i < n; ++i){
scanf("%d", &a[i]);
}
for (int i = 0; i < (n-1); ++i){
a[i] = gcd(a[i], a[i+1]);
}
printf("The gcd of the %d numbers is %d .\n", n, a[n-2]);
return 0;
}
看起来您在寻找 GCD 的代码中有几个错误。
您应该在 for 循环中更新 a[i+1]
的值而不是 a[i]
。并且 GCD 将是此更改后的第 a[n-1]
个元素。当您遍历循环时, a[i]
和 a[i+1]
将是您案例中的原始(输入)值。因此,如果其他一切正常,您的结果将是数组最后两个元素的 GCD (a[n-2]
、a[n-1]
)。
for (int i = 0; i < (n-1); ++i) {
a[i+1] = gcd(a[i], a[i+1]);
}
在gcd()
的while
循环中,需要做如下改动。检查 a==b
条件并将两个 if
条件更改为 if-else
条件。如果 b
是 a
的因数,则 a
在您的第一个 if
条件下变为 0
。然后在第二种情况下,您正在执行 % 0
并抛出错误。
while( (a != 0) && (b != 0) ){
if (abs(a)>=abs(b){
a = abs(a) % abs(b);
}
else if(abs(b)>abs(a)){
b = abs(b) % abs(a);
}
}
在下面的 while
循环中的第一印象
while( (a != 0) && (b != 0) ){
if (abs(a)>abs(b)){
a = abs(a) % abs(b); // value of a is altered and reused
}
if(b>a){
b = abs(b) % abs(a); // here <-- and could very well be a 0
}
}
换句话说,你可以删除 else {}
块,如果你能花点时间看看 else
块并没有真正增加任何价值,因为有一个 return
在 if
int gcd(int a, int b){
/** sanity checks */
if((a==0) || (b==0))
return 0;
/* few more obvious checks */
if( a % b == 0 )
return b;
if( b % a == 0 )
return a;
/* Real Logic */
while( (a != 0) && (b != 0) ){
if (abs(a)>abs(b)){
a = abs(a) % abs(b);
}
else if(abs(b) > abs(a) ){
b = abs(b) % abs(a);
}
}
/* Final results */
return (a == 0) ? b : a;
}
对于我的介绍。编程考试复习 我被要求编写一个程序,该程序使用一个函数来计算一组数字的 gcd。我写了下面的代码,有时似乎工作正常,但其他人 returns 浮点异常 8。我希望有人能阐明一些问题。
我在 mac 终端上使用 clang gcd.c -o gcd
使用 macOS High Sierra 和 return FP 错误的数字 5372 18960 -230048 1185 16486
这是代码:
#include <stdio.h>
#include <stdlib.h>
int gcd(int a, int b){
if((a==0) || (b==0)){
return 0;
}else{
if( a % b == 0 ){
return b;
}else{
if ( b % a == 0 ){
return a;
}
}
}
while( (a != 0) && (b != 0) ){
if (abs(a)>abs(b)){
a = abs(a) % abs(b);
}
if(b>a){
b = abs(b) % abs(a);
}
}
if (a == 0){
return b;
}else{
return a;
}
}
int main(void){
int n;
printf("Please enter the number of integers in your array:\n");
scanf("%d", &n);
int a[n];
printf("Please enter the numbers in your arrray:\n");
for (int i = 0; i < n; ++i){
scanf("%d", &a[i]);
}
for (int i = 0; i < (n-1); ++i){
a[i] = gcd(a[i], a[i+1]);
}
printf("The gcd of the %d numbers is %d .\n", n, a[n-2]);
return 0;
}
看起来您在寻找 GCD 的代码中有几个错误。
您应该在 for 循环中更新 a[i+1]
的值而不是 a[i]
。并且 GCD 将是此更改后的第 a[n-1]
个元素。当您遍历循环时, a[i]
和 a[i+1]
将是您案例中的原始(输入)值。因此,如果其他一切正常,您的结果将是数组最后两个元素的 GCD (a[n-2]
、a[n-1]
)。
for (int i = 0; i < (n-1); ++i) {
a[i+1] = gcd(a[i], a[i+1]);
}
在gcd()
的while
循环中,需要做如下改动。检查 a==b
条件并将两个 if
条件更改为 if-else
条件。如果 b
是 a
的因数,则 a
在您的第一个 if
条件下变为 0
。然后在第二种情况下,您正在执行 % 0
并抛出错误。
while( (a != 0) && (b != 0) ){
if (abs(a)>=abs(b){
a = abs(a) % abs(b);
}
else if(abs(b)>abs(a)){
b = abs(b) % abs(a);
}
}
在下面的 while
循环中的第一印象
while( (a != 0) && (b != 0) ){
if (abs(a)>abs(b)){
a = abs(a) % abs(b); // value of a is altered and reused
}
if(b>a){
b = abs(b) % abs(a); // here <-- and could very well be a 0
}
}
换句话说,你可以删除 else {}
块,如果你能花点时间看看 else
块并没有真正增加任何价值,因为有一个 return
在 if
int gcd(int a, int b){
/** sanity checks */
if((a==0) || (b==0))
return 0;
/* few more obvious checks */
if( a % b == 0 )
return b;
if( b % a == 0 )
return a;
/* Real Logic */
while( (a != 0) && (b != 0) ){
if (abs(a)>abs(b)){
a = abs(a) % abs(b);
}
else if(abs(b) > abs(a) ){
b = abs(b) % abs(a);
}
}
/* Final results */
return (a == 0) ? b : a;
}