Find the answer to your Linux question:
Results 1 to 3 of 3
Hi all, I am working on a C++ program that converts a decimal to a fraction, finds the lowest common multiple, multiplies the numerator by the denominator, then reduces the ...
  1. #1
    Just Joined!
    Join Date
    Mar 2007
    Posts
    7

    C++, issues converting decimal to fraction

    Hi all,

    I am working on a C++ program that converts a decimal to a fraction, finds the lowest common multiple, multiplies the numerator by the denominator, then reduces the fraction again so the fraction will be 'numerator/1'.

    I am using this code in a larger program to change a floating point slope value to a whole value for slope-intercept equations and standard form equations.

    The program will run but I tested almost 500 numbers and 20 numbers made the program crash (it stalled and did not finish the equation, I had to close the terminal and open it up again... )

    These 20 numbers I had problems with:

    2.36, 7.36, 1.11, 1.001, 1.66, 1.88, 2.22, 2.13, 3.24, 3,26, 3.32, 3.43, 3.49, 3.51, 3.57, 3.68, 3.74, 3.76, 3.82

    (I am sure there are more...)

    I have tried c-style casting and dynamic and static casting to try to resolve this issue. Can someone help me out and point out why these certain numbers make the program crash and offer a possible sloution?

    I tried debugging this program on gdb and keep on getting this frustrating message..

    (gdb) break 16
    No line 16 in file "init.c".
    (gdb)


    Here is the program's code, I also attached the tarball of the code to this thread as well:

    Code:
    //example.cc
    #include <iostream>
    #include "reduce.h"
    #include "decimal-to-fraction.h"
    using namespace std;
    
    int main()
    {
    	double deci;
    	double n, d;
    
    	while(1) {
    		cout << "Enter a decimal to convert to a fraction ('0' to quit): ";
    		cin >> deci;
    		cin.ignore(INT_MAX, '\n');
    		if(!deci) exit(0);
    		
    		dec_to_frac(deci, n, d);
    		
    		if (n * d != n){
    			cout << '\n' << deci << " = " << n << '/' << d << "\n\n";
    			cout<<'\n' << d << " x " << n;
    			n = d * n;
    			cout<< " = " << n << "\n\n";
    			cout<<'\n' << n << '/' << d; 
    			reduce(n, d);
    		
    			cout << " = " << n << '/' << d << "\n\n";
    
    			cout<<'\n' << n << "\n\n";
    		}
    		
    		else
    			cout<<'\n' << deci<< "\n\n";
    	
    	}
    
    	return 0;
    }
    
    #ifndef _REDUCE_H_
    
    #error You must include "reduce.h" before this file
    
    #endif /* def _REDUCE_H_ */
    
    
    
    #ifndef _DECIMAL_TO_FRACTION_H_
    
    #define _DECIMAL_TO_FRACTION_H_
    
    
    
    void dec_to_frac(double decimal, double &numerator, double &denominator)
    
    {
    
    	//numerator = static_cast<int >(decimal);
    	//numerator = (int )decimal;
    	numerator = decimal;
    
    	denominator = 1;
    	
    
    
    	while(numerator != (int)numerator) {
    
    		numerator *= 10;
    
    		denominator *= 10;
    
    	}
    
    	reduce(numerator, denominator);
    
    }
    
    
    
    #endif /* def _DECIMAL_TO_FRACTION_H_ */
    
    #ifndef _REDUCE_H_
    
    #define _REDUCE_H_
    
    
    
    void reduce(double &numer, double &denom)
    
    {
    
    	int i;
    
    
    
    	for(i=2; i<=numer; ++i) {
    		
    
    		if( ((numer/i) == ((int )(numer/i))) && ((denom/i) == ((int)(denom/i))) ) {
    
    			numer /= i;
    
    			denom /= i;
    
    			--i;              
    
    		}
    
    	}
    
    }
    
    
    
    #endif /* def _REDUCE_H_ */

  2. #2
    Trusted Penguin Cabhan's Avatar
    Join Date
    Jan 2005
    Location
    Seattle, WA, USA
    Posts
    3,230
    Add in some cerr outputs so that you can track where in the program it gets. Make sure to add some to the loops and print out the numbers it's working with.
    DISTRO=Arch
    Registered Linux User #388732

  3. #3
    Just Joined!
    Join Date
    Mar 2007
    Posts
    7
    Thank you Cabhan, I will look up Cerr outputs in some of my books.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
...