我第一次遇到浮点异常而且我不知道该怎么做

时间:2014-03-27 03:46:59

标签: c floating-point

我必须创建一个程序,按照一定的顺序混乱数字,我知道我的代码可能不是最好的,但我有一个浮点异常,我不明白为什么,任何帮助将不胜感激

 #define DIV 10
 long long int inputNum();
 int checkLength(long long int);
 int even(int, long long int);
 int odd(int, long long int);
 long long int calcNewNum(int, long long int);
 void print(long long int, long long int);

 int main()
 {
   long long int input = 0;
   int length = 0;
   int check = 0;
   int finalNum = 0;

   input = inputNum();
   length = checkLength(input);
   check = odd(length, input);
   finalNum = calcNewNum(length, input);
   print(input, finalNum);
   return(0);
 }

 long long int inputNum()
 {
   long long int input = 0;
   do{
   printf("Enter your non-negative integer: ");
   scanf("%lld", &input);
   if(input < 0)
   {
     printf("Error!  Non-negative integers only!!\n");
   }
   }while(input < 0);
   return(input);
 }

 int checkLength(long long int input)
 {
   int ct = 0;

   do{
   input /= DIV;
   ct++;
   }while(input != 0);

   return(ct);
 }

 int even(int length, long long int input)
 {
   int digitOne = 0;
   int digitTwo = 0;
   int i;
   int divideOne = 0;
   int firstNum = 0;
   int secondNum = 0;
   int finalNum = 0;

   digitOne = length / 2;
   digitTwo = (length / 2) + 1;

   divideOne = length - digitTwo;

   for(i = 0; i < divideOne; i++)
   {
     input /= DIV;
   }

   secondNum = input % DIV;
   input /= DIV;
   firstNum = input % DIV;

   if(firstNum < secondNum)
   {
     finalNum = firstNum;
   }
   else
   {
     finalNum = secondNum;
   }
   return(finalNum);
 }

 int odd(int length, long long int input)
 {
   int digit = 0;
   int i;
   int divide = 0;
   int midNum = 0;

   digit = length / 2;

   divide = length - digit;

   for(i = 0; i < digit; i++)
   {
     input /= DIV;
   }

   midNum = input % DIV;

   return(midNum);
 }

 long long int calcNewNum(int length, long long int input)
 {
   int finalNum = 0;
   long long int holder = 0;
   int ct = 0;
   int singleNum = 0;
   long long int temp = 0;

   holder = input;
   ct = length;

   if(input == 0)
   {
     finalNum = 0;
   }
   if(input / 10 == 0)
   {
     finalNum = input;
   }

   holder = input;

   while(holder > 0)
   {
     if(holder % 2 == 0)
     {
       singleNum = even(length, holder);
       length--;
     }
     if(holder % 2 == 1)
     {
       singleNum = odd(length, holder);
       length--;
     }
     temp = holder % (long long int)pow(DIV,ct - 1);
     holder /= pow(DIV, ct - 1);
     holder *= pow(DIV, ct - 2);
     holder += temp;
     ct--;
     finalNum += singleNum;
     printf("%lld", holder);
     if(holder != 0)
     {
       finalNum *= DIV;
     }
   }
   return(finalNum);
 } 

 void print(long long int input, long long int finalNum)
 {
   printf("Original Input: %lld", input);
   printf("Altered Number: %lld", finalNum);
 } 

3 个答案:

答案 0 :(得分:2)

上面评论中的Greg是对的 - 错误发生在第164行,当变量ct为0时,它除以零错误。在该行中,你将10除以幂ct -1那将是10 ^( - 1)。所以pow()返回.1并且因为你把它转换成long long int,小数被截断并且它试图除以0。

此错误似乎仅在输入数字的总和大于或等于10时才会发生。我没有通过整个程序来弄清楚为什么会这样。该计划的目标究竟是什么?

答案 1 :(得分:0)

好的,就像其他人提到的那样,对于一个数字总和大于或等于10的输入,在行

 temp = holder % (long long int)pow(DIV,ct - 1);

模数的右边部分

(long long int)pow(DIV,ct - 1);

返回0.因此模运算溢出(除以0)。

顺便说一下,它返回0,因为你的代码以某种方式达到ct = 0,也就是说,你试图计算10 ^ { - 1};这对应于十进制数0.1,它在整数类型中舍入为0。

我不知道你的代码在做什么,但它有一个错误:D

答案 2 :(得分:0)

问题在这里

 temp = holder % (long long int)pow(DIV,ct - 1);

它总是返回一些负值,因此temp将始终与您输入的数字相同。所以这个

 holder /= pow(DIV, ct - 1); 

总是将持有人设为0,而holder += temp;将始终将持有人设为已输入的数字。

while(holder&gt; 0)将始终为true,并且无限运行。

检查 pow()。它的标志是双音(双x,双y),你正在使用DIV。这可能是个问题。