1. Converting decimal number to carpenter's fractions

Does anyone have, or can recommend a routine to convert decimals to carpenters inch fractions: 32nds, 16ths, 8ths, 4ths, halfs? I have a list of equivalents so I guess If there is no exact match, I would need to compare up the list until a higher value is reached and then subtract my search value from the larger value and subtract the previous lower value from the decimal value I am seeking to convert and then select the value which has the lowest difference.

sequence decimal_fractions { 
{.03125, 1, 32}, 
{.06250, 1, 16}, 
{.09375, 3, 32}, 
 ..... 
{.96875, 31, 32} 
 
 
 
x = 0.07356   
0.09375 - 0.07356 = 0.02019 
0.07356 - 0.06250 = 0.01106 x = {1,16}  or 1/16th inch 

Seems like there must be an easier way, though.

Any suggestions would be appreciated.

new topic     » topic index » view message » categorize

2. Re: Converting decimal number to carpenter's fractions

K_D_R said...

Does anyone have, or can recommend a routine to convert decimals to carpenters inch fractions: 32nds, 16ths, 8ths, 4ths, halfs? I have a list of equivalents so I guess If there is no exact match, I would need to compare up the list until a higher value is reached and then subtract my search value from the larger value and subtract the previous lower value from the decimal value I am seeking to convert and then select the value which has the lowest difference.

sequence decimal_fractions { 
{.03125, 1, 32}, 
{.06250, 1, 16}, 
{.09375, 3, 32}, 
 ..... 
{.96875, 31, 32} 
 
 
 
x = 0.07356   
0.09375 - 0.07356 = 0.02019 
0.07356 - 0.06250 = 0.01106 x = {1,16}  or 1/16th inch 

Seems like there must be an easier way, though.

Any suggestions would be appreciated.

I've used something like this

-- minimum fraction default 1/64th 
-- needs more work if want to find the nearest fraction over or under. 
-- might be nice to return the amount over if any. 
-- 
public function dec_frac(atom x1, atom minfraction = 0.015625) 
	atom numerator = 1, denominator = 2, mf = 64 
	x1 += 0.00002 
	if minfraction < 1 then 
		mf = floor(math:abs(1/minfraction)) 
	end if 
 
    for r = numerator to mf - 1 do 
      if abs(x1 - (r/mf)) <= minfraction  then 
    	numerator = r  
    	goto "done" 
      end if 
    end for  
 
    return {}	--error 
	label "done" 
 
	--simplity 
	return {numerator/math:gcd(numerator, mf) 
			, mf/math:gcd(numerator, mf)} 
end function 
 
 
 test_equal("dec_frac 1/32",{1,32}, trig:dec_frac(1/32)) 
 test_equal("dec_frac 1/16",{1,16}, trig:dec_frac(1/16)) 
 test_equal("dec_frac 3/32",{3,32}, trig:dec_frac(.094)) 
 test_equal("dec_frac 1/4",{1,4}, trig:dec_frac(0.25)) 
 test_equal("dec_frac 5/8",{5,8}, trig:dec_frac(0.625)) 
 test_equal("dec_frac 7mm",{17,64}, trig:dec_frac(0.2756)) 
 
new topic     » goto parent     » topic index » view message » categorize

3. Re: Converting decimal number to carpenter's fractions

x/10 = y/32

y = x * 16 / 5

round result

new topic     » goto parent     » topic index » view message » categorize

4. Re: Converting decimal number to carpenter's fractions

K_D_R said...

Does anyone have, or can recommend a routine to convert decimals to carpenters inch fractions: 32nds, 16ths, 8ths, 4ths, halfs?

 
 
constant mm_inch = 1/25.4 
 
function carp( atom x, atom conv = 1) 
    integer numerator 
    integer denominator 
    integer units 
     
    x *= conv 
    if x > 1 then 
        units = floor(x) 
        x -= units 
    else 
        units = 0 
    end if   
    numerator = floor( x * 64 + 0.5) 
    denominator = 64 
    while denominator > 1 do 
        if remainder(numerator,2) = 1 then 
            exit 
        end if 
     
        numerator /= 2 
        denominator /= 2 
    end while 
 
    return {units,numerator,denominator} 
 
end function 
 
? carp(0.625) --> {0,5,8}  ie. five eigths 
 
? carp(2.314) --> {2,5,16}  ie. two and five sixteenths 
 
? carp(38, mm_inch) --> {1,1,2}  ie. 38mm -> 1 1/2 inch 
new topic     » goto parent     » topic index » view message » categorize

5. Re: Converting decimal number to carpenter's fractions

Thanks to all who responded with helpful instructions and code.

WOW! I am often stunned at the programming expertise you guys share in the forum.

I deeply appreciate the assistance.

new topic     » goto parent     » topic index » view message » categorize

6. Re: Converting decimal number to carpenter's fractions

function carp(atom x) 
  integer u = floor(x) 
  integer n = floor((x-u) * 64 + 0.5) 
  -- boundary conditions 
  -- x-u >= 127/128 
  if n = 64 then 
	  return {u+1, 0, 1}  -- orginal function returned {u, 1, 1} 
  -- x-u < 1/128 
  elsif n = 0 then 
     return {u, 0, 1}    -- normal form 
  -- n in range 1-63 
  else 
    integer d = 64 
    while remainder(n, 2) = 0 do 
      n /= 2 
      d /= 2 
    end while 
    return {u, n, d} 
  end if 
end function 

results:

carp(0)       : {0,0,1} 
carp(1)       : {1,0,1} 
carp(0.625)   : {0,5,8} 
carp(2.314)   : {2,5,16} 
carp(127/128) : {1,0,1}  -- rounds up 
carp(1/128)   : {0,1,64} 
Other comment:

In the original code the normaisation loop went

d = 64 
while d > 1 do 
  if remainder(n, 2) = 1 then 
    exit 
  end if 
  n /= 2 
  d /= 2 
end while 

The only way this loop can normally terminate is if n started as 0 or 64.

Both conditions meet the test:

  remainder(n, 2) = 0 
 
the test d > 1 produces: 
  64  64      0 64 
  32  32      0 32 
  ......      .... 
   1   1      0  1 
<eucode> 
In the case n = 0, n doesn't change. 
 
In the case n = 64, the reduction shouldn't be 
applied as 64/64 is not a proper fraction. 
 
From a programming perspective 
<eucode> 
   while d > 1 do 

is a poor choice because it runs until d <= 1. It exits abnormally in almost all cases.

  while remainder(n, 2) = 0 

works properly because, *given n is in 0-63*, we know n reduces as d reduces and n must reduce to an odd number.

new topic     » goto parent     » topic index » view message » categorize

7. Re: Converting decimal number to carpenter's fractions

A bit more generic version ...

include std/math.e 
constant  
	mm_inch = 1/25.4, 
	cm_inch = 1/2.54, 
	m_ft    = 1000 / 304.8 
 
function carp( atom x, atom conv = 1, integer base = 64) 
    integer numerator 
    integer denominator 
    integer units 
    integer sign 
     
    -- Apply any Unit-of-measure conversion 
    x *= conv 
     
    -- Remember original sign and ensure working is on absolute value. 
    if x >= 0 then 
    	sign = 1 
    else 
    	sign = -1 
    	x = -x 
    end if 
     
    -- Express original value in terms of how many 'base' fragments it is (rounded) 
    x = floor(x * base + 0.5) 
     
    -- Get numerator in range of 0 to base-1 
    numerator = remainder(x, base) 
   	 
    -- Strip off the non-fraction part 
   units = (x - numerator) / base 
   	 
    denominator = base 
    if numerator > 0 then 
    	-- First, normalize the fraction in terms of GCD 
    	x = gcd(numerator, denominator) 
        numerator /= x 
        denominator /= x 
    	 
    	-- Next, normalize the fraction until either top or botton is an odd number. 
        while remainder(numerator,2) = 0 and remainder(denominator,2) = 0 do 
            numerator /= 2 
            denominator /= 2 
        end while 
    end if 
    return {units, numerator, denominator, sign} 
 
end function 
 
 
? carp(0)       -- {0,0,64,1}  
? carp(1)       -- {1,0,64,1}  
? carp(-0.625)   -- {0,5,8,-1}  
? carp(2.314)   -- {2,5,16,1}  
 
? carp(127/128) -- {1,0,64,1} 
? carp(127/128,,128) -- {1,127,128,1} 
? carp(1/128)   -- {0,1,64,1}  
? carp(257/256)   -- {1,0,64,1}  
 
? carp(38, mm_inch) --> {1,1,2,1}  ie. 38mm -> 1+1/2 inch 
? carp(38, mm_inch, 1000) --> {1,62,125,1}  ie. 38mm -> 1+62/125 inch 
 
? carp(1/3, 1, 9) --> {0,1,3,1} 
? carp(2/3, 1, 9) --> {0,2,3,1} 
? carp(5/27, 1, 9) --> {0,2,9,1} 
new topic     » goto parent     » topic index » view message » categorize

8. Re: Converting decimal number to carpenter's fractions

And it just gets better and better... smile

One question for Derek...

constant 
--  mm_inch = 1/25.4,   -- value to be computed 
    mm_inch = 0.0393700787,  -- constant 
--  cm_inch = 1/2.54, 
    cm_inch = 0.393700787, 
--  m_inch =  1/.0254, 
    m_inch =  39.3700787, 
--      m_ft    = 1000 / 304.8, 
      m_ft = 1000 / 304.7999995367 
    m_ft    = 3.2808399 
--  cm_ft   = 10 / 304.7999995367 
    cm_ft   = 0.032808399 

I noticed that you choose to computed the value of the constant every time. Jim Roberts used this method in his convert.e utility program as well. Why is it better to calculate the constant each time?

Regards,

new topic     » goto parent     » topic index » view message » categorize

9. Re: Converting decimal number to carpenter's fractions

K_D_R said...

Why is it better to calculate the constant each time?

Well, they only get calculated once, when the program starts up. And of course, translated programs don't calculate them at all. The main reason I do it this way is that some numbers are easier to remember than others. I remember 25.4 and 304.8 better than 0.0393700787 and 3.2808399 respectively. Also, sometimes I do it this way as it explains the magic number better.

new topic     » goto parent     » topic index » view message » categorize

10. Re: Converting decimal number to carpenter's fractions

Comments:

1. Negative lengths make no sense in the real world.

I would prefer to reject a request for an equivalent screw size of -38mm in 64ths of an inch as a type error.

2. The code as written has problems.

   denominator = base 
 
   -- *** 0, base is not normalised: GCD(0,3) = 3, not 0. 
   if numerator > 0 then 
      -- First, normalize the fraction in terms of GCD 
      x = gcd(numerator, denominator) 
      numerator /= x 
      denominator /= x 
 
      -- *** the following code will never run 
      -- Next, normalize the fraction until either top or bottom is an odd number. 
      while remainder(numerator,2) = 0 and remainder(denominator,2) = 0 do 
         numerator /= 2 
         denominator /= 2 
      end while 
       -- *** 
    end if 
    -- *** returns incorrect result when numerator is zero 
    return {units, numerator, denominator, sign} 
 
? carp(0)       -- {0,0,64,1}        -- *** should be {0,0,1,1} 
? carp(1)       -- {1,0,64,1}        -- *** should be {1,0,1,1} 
? carp(-0.625)  -- {0,5,8,-1} 
? carp(2.314)   -- {2,5,16,1} 
 
? carp(127/128) -- {1,0,64,1}        -- *** should be {1,0,1,1} 
? carp(127/128,,128) -- {1,127,128,1} 
? carp(1/128)   -- {0,1,64,1} 
? carp(257/256) -- {1,0,64,1}        -- *** should be {1,0,1,1} 
include std/math.e 
 
constant MAXINT = 2e30 
 
type Real(atom x) 
  return x >= 0 
end type 
 
type Nat(integer x) 
  return x >= 0 and x <= MAXINT 
end type 
 
type PNat(integer x) 
  return x > 0 and x <= MAXINT 
end type 
 
function carp(Real size, PNat base=64) 
   Nat t = floor(size * base + 0.5) 
   Nat n = mod(t, base) 
   Nat U = floor(t / base) 
   if n = 0 then 
      return {U, 0, 1}  -- accounting for a bug in gcd function 
   else 
      PNat g = gcd(n, base) 
		return {U, n/g, base/g} 
   end if 
end function 
 
/* 

? carp(0)       -- {0,0,1} 
? carp(1)       -- {1,0,1} 
? carp(2.314)   -- {2,5,16} 
? carp(1/128)   -- {0,1,64} 
? carp(127/128) -- {1,0,1} 
? carp(257/256) -- {1,0,1} 
*/ 
function GCD(integer a, integer b) 
   if a < 0 then 
      return GCD(-a, b) 
   elsif b < 0 then 
      return GCD(a, -b) 
   elsif b < a then 
      return GCD(b, a) 
   elsif a = 0 then 
      if b = 0 then 
         return {1, 0} -- error 
      else 
         return {0, b} 
      end if 
   else 
      return GCD(mod(b,a), a) 
   end if 
end function 
 
? GCD(3,4)  -- {0, 1} 
? GCD(0,0)  -- {1, 0} 
? GCD(-4,8) -- {0, 4} 
? GCD(3,0)  -- {0, 3} 
 
new topic     » goto parent     » topic index » view message » categorize

11. Re: Converting decimal number to carpenter's fractions

bill said...

1. Negative lengths make no sense in the real world.

Thank you, I'll mention that to my Physics professor. He was under the (obviously mistaken) impression that negative lengths could be used to represent direction.

bill said...

I would prefer to reject a request for an equivalent screw size of -38mm in 64ths of an inch as a type error.

How does the function know what you're measuring. That's why the sign is returned in its own field, so you, the caller, can deal with it as you see fit. It is not in this function's purpose to assume that negative input is an error. Whether or not it's an error is in the caller's knowledge domain.

bill said...

2. The code as written has problems.

   -- *** 0, base is not normalised: GCD(0,3) = 3, not 0. 

This is not a mistake. It is a deliberate behaviour of the function. The purpose of returning the base as the denominator when the numerator is zero is to give the caller information about the 'base' - namely what is the default value. The caller, upon receiving the numerator output of zero, can then decide to use the 'base' denominator or not, according to the application's needs. This function does not presume why it is being called.

You would know that given a numerator of zero, the value of the denominator is not really required; it could be anything, so I may as well return something that could be useful.

bill said...

2. The code as written has problems.

      -- *** the following code will never run  
      -- Next, normalize the fraction until either top or bottom is an odd number.  
      while remainder(numerator,2) = 0 and remainder(denominator,2) = 0 do  
         numerator /= 2  
         denominator /= 2  
      end while  

You are correct. This is totally redundant.

new topic     » goto parent     » topic index » view message » categorize

12. Re: Converting decimal number to carpenter's fractions

K_D_R said...

Why is it better to calculate the constant each time?

LOL. For much the same reason you want carpenters fractions. Humans find them easier.

bill said...

1. Negative lengths make no sense in the real world.

Not so. Cut a panel the exact size of a hole and there is no room for expansion/beading/silicone/putty. If you have a 1 inch baton, you don't use 1 inch screws. So "-3/32", say, is not only valid but common.

Pete

new topic     » goto parent     » topic index » view message » categorize

13. Re: Converting decimal number to carpenter's fractions

petelomax said...
K_D_R said...

Why is it better to calculate the constant each time?

LOL. For much the same reason you want carpenters fractions. Humans find them easier.

Pete

Carpenter's fractions may be easier for those habituated in their use, but I find the metric system much easier to use. It seems that most of the world, except the U.S. and the U.K., find the metric system easier to us. I think that even the U.K. may be further along than the U. S., as far as adopting the metric system.

Regards,

new topic     » goto parent     » topic index » view message » categorize

14. Re: Converting decimal number to carpenter's fractions

Derek & Pete

Re negative lengths:

Vectors have magnitude and direction,
a length is a magnitude.

Euclid: a point has position but no magnitude.

Physically it is the difference between speed and velocity:
making something smaller doesn't make negative length.

Quoting Wikipedia:

In physics, velocity is speed in a given direction. Speed
describes only how fast an object is moving, whereas velocity
gives both the speed and direction of the object's motion.
To have a constant velocity, an object must have a constant
speed and motion in a constant direction.

Re: non-normalised form (U, 0, 64) "shows the base.."

According to that reasoning {U, 5, 8} should be written {U, 40, 64}
And as a consequence of that you get {U, 1, 64} = {U, 2, 128} = ...
And (as stated) GCD(0,64) = 64. Normalised {U, 0, 64} = [U, 0, 1}.

Comparing sizes you will see normailastion is a GOOD IDEA.

new topic     » goto parent     » topic index » view message » categorize

15. Re: Converting decimal number to carpenter's fractions

bill said...

Derek & Pete

Re negative lengths:

Vectors have magnitude and direction,
a length is a magnitude.

Agreed, if you are going to be fussy about the definitions of length and vectors and speed and velocity and so on...

The differences between these concepts are more-or-less academic to most programmers. More importantly, I can not see a reason to, to use your terminology, allow only lengths to be used by these routines, but forbid the use of vectors with them. Perhaps the programmer intended to, and actually wants to, deal with vectors even though that person calls them lengths. So what?

Of course, you can use a two element sequence to represent magnitude and direction, but if you only need two directions then I can see the elegance of using the sign bit here.

new topic     » goto parent     » topic index » view message » categorize

16. Re: Converting decimal number to carpenter's fractions

K_D_R said...
petelomax said...
K_D_R said...

Why is it better to calculate the constant each time?

LOL. For much the same reason you want carpenters fractions. Humans find them easier.

Pete

Carpenter's fractions may be easier for those habituated in their use, but I find the metric system much easier to use. It seems that most of the world, except the U.S. and the U.K., find the metric system easier to us. I think that even the U.K. may be further along than the U. S., as far as adopting the metric system.

Regards,

For some things, decimals are easier. For other things, fractions are easier.

There are times when fractions are "cleaner" and more exact than are rounded decimals.

new topic     » goto parent     » topic index » view message » categorize

17. Re: Converting decimal number to carpenter's fractions

Jay Gade said...

For some things, decimals are easier. For other things, fractions are easier.

There are times when fractions are "cleaner" and more exact than are rounded decimals.

Please give me an example to illustrate your point.

new topic     » goto parent     » topic index » view message » categorize

18. Re: Converting decimal number to carpenter's fractions

DerekParnell said...
K_D_R said...

Why is it better to calculate the constant each time?

Well, they only get calculated once, when the program starts up. And of course, translated programs don't calculate them at all. The main reason I do it this way is that some numbers are easier to remember than others. I remember 25.4 and 304.8 better than 0.0393700787 and 3.2808399 respectively. Also, sometimes I do it this way as it explains the magic number better.

Interesting answer. I understand and agree. Thanks.

new topic     » goto parent     » topic index » view message » categorize

19. Re: Converting decimal number to carpenter's fractions

K_D_R said...
said...

For some things, decimals are easier. For other things, fractions are easier.

There are times when fractions are "cleaner" and more exact than are rounded decimals.

Please give me an example to illustrate your point.

I think the simplest example is 1/3. It has no exact representation, of course, in binary fractions (e.g., IEEE floating point numbers). Likewise, money fractions tend to be 1/100s, many of which cannot be represented exactly in binary fractions. It can be very important to get exact answers from calculations using these sorts of numbers where the errors introduced by binary approximations are unacceptable.

Matt

new topic     » goto parent     » topic index » view message » categorize

20. Re: Converting decimal number to carpenter's fractions

bill said...

Re negative lengths:

Vectors have magnitude and direction,
a length is a magnitude.

Agreed, but that is not relevant. The function in question is dealing with scalars and it has no concept of what the arguments represent. It doesn't care if the value to translate is a length, vector, or anything else. If the caller wants to use negative numbers then why should the function care? All it's dealing with (the API/contract) is a number. To assist the caller, it preserves the original sign in case the application needs to use it.

The thing with library routines is that they should avoid making demands on the calling application that are orthogonal to the purpose of the function. This particular function just translates a decimal version of a number to some fractional version. The documentation should detail the contract between the caller and the routine.

bill said...

Re: non-normalised form (U, 0, 64) "shows the base.."

According to that reasoning {U, 5, 8} should be written {U, 40, 64}

If I might, can I reiterate that (mis)quote in context?

Derek said...

The purpose of returning the base as the denominator when the numerator is zero is to give the caller information about the 'base' - namely what is the default value. The caller, upon receiving the numerator output of zero, can then decide to use the 'base' denominator or not, according to the application's needs. This function does not presume why it is being called.

There is no reasoning from {U,0,base} to {U,N,base}. So let me repeat myself ... when the numerator is zero ... the value of the denominator is not really required; it could be anything, so I may as well return something that could be useful. Useful to the caller, that is. To always return {U, 0, 1} when there is no fractional part is perfectly fine, except that its a waste of information bandwidth. This is not a mathematics environment; the function is trying to be useful to the caller by communicating information that may be gainfully employed by the application.

bill said...

And as a consequence of that you get {U, 1, 64} = {U, 2, 128} = ...
And (as stated) GCD(0,64) = 64. Normalised {U, 0, 64} = [U, 0, 1}.

Comparing sizes you will see normailastion is a GOOD IDEA.

I'm a bit confused by this. You seem to be suggesting that normalization is the process of presenting a fraction such that the numerator and divisor are the smallest integers possible to represent the value. And that such normalization is useful for comparison of values. If I've got this wrong, please improve my understanding.

If this is so, I beg to differ.

Using this function 72/99 normalizes to {0,8,11,1} and 77/99 normalizes to {0,7,9,1}. But if we did a comparison of these normal forms, we find that 77/99 is less than 72/99!

A = carp(72/99, 1, 99)  --> {0,8,11,1} 
B = carp(77/99, 1, 99)  --> {0,7,9,1} 
compare(A,B) --> 1 

whereas some better ways to compare them is ...

A = carp(72/99, 1, 99)  --> {0,8,11,1} 
B = carp(77/99, 1, 99)  --> {0,7,9,1} 
compare(A[2] * B[3],B[2] * A[3]) --> -1 
compare(A[2] / A[3],B[2] / B[3]) --> -1 
new topic     » goto parent     » topic index » view message » categorize

21. Re: Converting decimal number to carpenter's fractions

mattlewis said...
K_D_R said...
said...

For some things, decimals are easier. For other things, fractions are easier.

There are times when fractions are "cleaner" and more exact than are rounded decimals.

Please give me an example to illustrate your point.

I think the simplest example is 1/3. It has no exact representation, of course, in binary fractions (e.g., IEEE floating point numbers). Likewise, money fractions tend to be 1/100s, many of which cannot be represented exactly in binary fractions. It can be very important to get exact answers from calculations using these sorts of numbers where the errors introduced by binary approximations are unacceptable.

Matt

Just before logging on, I also thought of the example of 1/3 in terms of being easier to express than .33333... as Derek uses fractions in the code segment that inspired the original question. So, I understand that using fractions can be much easier to remember than long decimal numbers.

But as far as exactness and accuracy... 1/3 may be an exact expression, but that exactness gives an illusion of accuracy and does not appear to me to be more accurate than a rounded decimal, at least for the purpose at hand:

printf(1, "\n1/3 inch = %1.5fmm", 1/3 * 25.4)  
printf(1, "\n%1.1fmm = ", 1/3 *25.4) ?carp(1/3*25.4,mm_inch,128)                                                                                                                                                                                        
puts(1, "1/3 inch, base 128 = ")     ?carp(1/3, 1, 128)                                                                                                                             
puts(1, "1/3 inch, base 16 = ")      ?carp(1/3, 1, 16) 
puts(1, "43/128inch-5/16inch = ")    ?carp(43/128-5/16,1,32)   

1/3 inch = 8.46667mm 
8.5mm = {0,43,128,1} 
1/3 inch, base 128 = {0,43,128,1} 
1/3 inch, base 16 = {0,5,16,1} 
43/128inch-5/16inch = {0,1,32,1} 

Did I do this right? The rounded decimal figure appears to be as accurate as the most accurate fraction. Also, I dare say it is much easier to use. My metric/inch tape measure is marked in 16ths of an inch. Simple rounding of the metric reading appears to be more accurate by 1/32", right?

Regards, Kenneth Rhodes

new topic     » goto parent     » topic index » view message » categorize

22. Re: Converting decimal number to carpenter's fractions

K_D_R said...

But as far as exactness and accuracy... 1/3 may be an exact expression, but that exactness gives an illusion of accuracy and does not appear to me to be more accurate than a rounded decimal, at least for the purpose at hand:

The effects of this can be more easily seen when we scale up the calculations.

atom a 
 
a = 0 
for i = 1 to 300 do 
	a += 2/3 
end for 
 
printf(1, "%15.15f\n", a) --> 199.999999999999318 
? a = 200 --> 0 
 
a = ((2 / 3) * 300) 
printf(1, "%15.15f\n", a) --> 200.000000000000000 
? a = 200 --> 1 
 
a = 0 
for i = 1 to 300 do 
	a += 0.666666666666667 
end for 
 
printf(1, "%15.15f\n", a) --> 199.999999999999346 
? a = 200 --> 0 
new topic     » goto parent     » topic index » view message » categorize

23. Re: Converting decimal number to carpenter's fractions

K_D_R said...

Did I do this right? The rounded decimal figure appears to be as accurate as the most accurate fraction. Also, I dare say it is much easier to use. My metric/inch tape measure is marked in 16ths of an inch. Simple rounding of the metric reading appears to be more accurate by 1/32", right?

As always, accuracy and precision don't mean much out of context. If the accuracy is good enough for your purpose, then it's good enough. For stuff like this, my ability to cut / position things is a lot less precise than 1/32". If you're calculating something in a financial context, people may get upset about a penny here or there.

Matt

new topic     » goto parent     » topic index » view message » categorize

24. Re: Converting decimal number to carpenter's fractions

I was surprised by the common usage of U.S.-English measurement systems in Argentina of all places. I was under the impression that the rest of the world was completely metric and it was just in North America where we had the legacy of English measurements. Although wood is often sold using metric units (and with the same sizes as in Canada) often the person behind the counter is as versed in inches as he is in metric. With carpenter sized nuts and bolts as well common place.

new topic     » goto parent     » topic index » view message » categorize

25. Re: Converting decimal number to carpenter's fractions

Derek,

In answer to your questions:

There is no reasoning from {U,0,base} to {U,N,base}. So let me repeat myself ... \\ 
when the numerator is zero ... the value of the denominator is not really required; \\ 
it could be anything, so I may as well return something that could be useful.  
Useful to the caller, that is. To always return {U, 0, 1} when there is no  
fractional part is perfectly fine, except that its a waste of information bandwidth.  
This is not a mathematics environment; the function is trying to be useful to the  
caller by communicating information that may be gainfully employed by the application. 
problem: compare for equality:  
   {0, 0, 1, -1} {0, 0, 64, -1} {0, 0, 64, 1} 
   they all equal zero yet they are all different. 
 
waste of bandwidth: 
   another view on is: not providing misleading or spurious data. 
Bill 
 
And as a consequence of that you get {U, 1, 64} = {U, 2, 128} = ... 
And (as stated) GCD(0,64) = 64. Normalised {U, 0, 64} = [U, 0, 1}. 
 
Comparing sizes you will see normalisation is a GOOD IDEA. 
Im a bit confused by this. You seem to be suggesting that normalization is the  
process of presenting a fraction such that the numerator and divisor are the  
smallest integers possible to represent the value. And that such normalization is  
useful for comparison of values. If Ive got this wrong, please improve my  
understanding. 
OK: 
 
1. 72/99 * 63/87 * 255/2436 is going to produce a rather large fraction unless  
   normalised.  
 
2 there are an infinite number of unnormalised representations of 1/2 
  ... -1/-2,1/2 ... 
  comparing a normalised fraction for equality is 
  a/b = c/d if a=c and b=c 
  comparing an unnormalised fraction is 
  a/b = c/d if a*d = c*b 
  the first is the less expensive operation (and particularly so for people) 
  255/2436 = 85/812? 
If this is so, I beg to differ. 
 
Using this function 72/99 normalizes to {0,8,11,1} and 77/99 normalizes to {0,7,9,1}.  
But if we did a comparison of these normal forms, we find that 77/99 is less than 72/99! 
 
A = carp(72/99, 1, 99)  --> {0,8,11,1}  
B = carp(77/99, 1, 99)  --> {0,7,9,1}  
compare(A,B) --> 1  

Well yes comparing them as sequences is silly.

whereas some better ways to compare them is ... 
 
A = carp(72/99, 1, 99)  --> {0,8,11,1}  
B = carp(77/99, 1, 99)  --> {0,7,9,1}  
compare(A[2] * B[3],B[2] * A[3]) --> -1  
compare(A[2] / A[3],B[2] / B[3]) --> -1  

Yes

  function eq(rat a, rat b) 
     return a[1]=b[1] and a[2]=b[2] 
 
  end function 
  function lt(rat a, rat b) 
     return a[i]*b[2] = b[1]*a[2] 
  end function 

BTW as your function stands it still could be improved.

You do not require the denominator to be positive.
If it is 0 the function will blow up when it tries to do a remainder(0,0).
If it is negative it will return peculiar results.

new topic     » goto parent     » topic index » view message » categorize

26. Re: Converting decimal number to carpenter's fractions

SDPringle said...

I was surprised by the common usage of U.S.-English measurement systems in Argentina of all places.

I'm in Australia and work in a spare parts warehouse for automotive equipment. We are constantly working in both metric and imperial every day, sometimes on the same item. We have some hose/tubing whose length is in metric and diameter is in imperial (A customer asks for 1 meter of 5inch tube). Same with some belts; width is in metric and length is in inches.

new topic     » goto parent     » topic index » view message » categorize

27. Re: Converting decimal number to carpenter's fractions

bill said...

BTW as your function stands it still could be improved.

Of course! Who's code couldn't be improved?

new topic     » goto parent     » topic index » view message » categorize

28. Re: Converting decimal number to carpenter's fractions

mattlewis said...
K_D_R said...

Did I do this right? The rounded decimal figure appears to be as accurate as the most accurate fraction. Also, I dare say it is much easier to use. My metric/inch tape measure is marked in 16ths of an inch. Simple rounding of the metric reading appears to be more accurate by 1/32", right?

As always, accuracy and precision don't mean much out of context. If the accuracy is good enough for your purpose, then it's good enough. For stuff like this, my ability to cut / position things is a lot less precise than 1/32". If you're calculating something in a financial context, people may get upset about a penny here or there.

Matt


Sometimes it matters. I just had some holes drilled, i spec'd 0.234 but was accepting 6mm (0.236). What i got was 0.232, and stuff simply didn't fit such a small hole. Just the same, i need to remove 0.001 from all around the hole perimeter, and 0.002 will be excessive, and the hole must remain round, so care is required, and proper measuring.

useless

new topic     » goto parent     » topic index » view message » categorize

29. Thanks for the function - works like a charm

 3-Frequency, Class 1, Method 1, Icosahedron: Current Unit of Measure: ft 
    Dome Diameter: 39.000 Reference Diameter (Sphere): 39.587 Dome Radius: 19.500  
    Elevation: Riser Wall: 4.500 Bottom Hex Base: 11.295 Apex Bottom Pent: 15.494  
        Hex Vertex: 16.832 Top Pent Base: 19.694 Top Pent Apex: 20.896  
    Dome floor center to: edge:Pent Wall: 19.500  
        Center, Pent Wall: 19.087 Center, Long Wall: 17.789  
    Lengths: Pent Base/Wall: 7.988  Hex Base/LongWall: 15.975  
    Area: 1194.591  Circumferance:  122.522  Surface Area: 2461.698  Volume: 16242.057 
 
 
    Length PA/HA    1,1 1,0         7.988 ft = 95 27/32 inches 
    Axial       0,0 1,0 1,1     78.359/11.641 
    Face        1,1 0,0 1,0     70.731 
    Face        1,1 2,1 1,0     58.583 
    Dihedral    1,1 1,0         168.641 
 
    Length HB:HC    2,1 2,0         8.163 ft = 97 31/32 inches 
    Axial       0,0 2,0 2,1     78.100/11.900 
    Face        2,1 1,0 2,0     60.708 
    Face        2,1 3,1 2,0     60.708 
    Dihedral    2,1 2,0         166.421 
 
    Length PB:PC    3,1 3,0         6.900 ft = 82 13/16 inches 
    Axial       0,0 3,0 3,1     79.962/10.038 
    Face        3,1 2,0 3,0     54.635 
    Dihedral    3,1 3,0         165.565 
 
    Length HA/PA    3,2 3,1         7.988 ft = 95 27/32 inches 
    Axial       0,0 3,1 3,2     78.359/11.641 
    Face        3,2 2,1 3,1     58.583 
    Dihedral    3,2 3,1         165.542 
 
 
    Current unit of measure: ft Default Dome Diameter: 39.000 ft 
 
    1: Enter/change diameter of dome, expressed in current units) 
    2: Change current unit of measure from ft to: m cm mm in:  
    3: Enter/change height of riser wall, expressed in current units 
    4: Quit 
----------------------------------------------------------------------- 
3-Frequency, Class 1, Method 1, Icosahedron: Current Unit of Measure: cm 
    Dome Diameter: 1188.720 (Sphere) Reference Diameter: 1206.625 Dome Radius: 594.360  
    Elevation: Riser Wall: 137.160 Bottom Hex Base: 344.265 Apex Bottom Pent: 472.262  
        Hex Vertex: 513.033 Top Pent Base: 600.260 Top Pent Apex: 636.921  
    Dome floor center to: edge:Pent Wall: 594.360  
        Center, Pent Wall: 581.760 Center, Long Wall: 542.207  
    Lengths: Pent Base/Wall: 243.466  Hex Base/LongWall: 486.932  
    Area: 1109810.989  Circumferance:  3734.474  Surface Area: 2286992.523  Volume: 459923846.840 
 
 
    Length PA/HA    1,1 1,0         243.466 cm = 95 27/32 inches 
    Axial       0,0 1,0 1,1     78.359/11.641 
    Face        1,1 0,0 1,0     70.731 
    Face        1,1 2,1 1,0     58.583 
    Dihedral    1,1 1,0         168.641 
 
    Length HB:HC    2,1 2,0         248.813 cm = 97 31/32 inches 
    Axial       0,0 2,0 2,1     78.100/11.900 
    Face        2,1 1,0 2,0     60.708 
    Face        2,1 3,1 2,0     60.708 
    Dihedral    2,1 2,0         166.421 
 
    Length PB:PC    3,1 3,0         210.324 cm = 82 13/16 inches 
    Axial       0,0 3,0 3,1     79.962/10.038 
    Face        3,1 2,0 3,0     54.635 
    Dihedral    3,1 3,0         165.565 
 
    Length HA/PA    3,2 3,1         243.466 cm = 95 27/32 inches 
    Axial       0,0 3,1 3,2     78.359/11.641 
    Face        3,2 2,1 3,1     58.583 
    Dihedral    3,2 3,1         165.542 
 
 
    Current unit of measure: cm Default Dome Diameter: 1188.720 cm 
 
    1: Enter/change diameter of dome, expressed in current units) 
    2: Change current unit of measure from cm to: m mm in ft:  
    3: Enter/change height of riser wall, expressed in current units 
    4: Quit 
     
 

new topic     » goto parent     » topic index » view message » categorize

30. This is why I like the metric System...

The text in the previous post would have sufficed, I guess. Seems I have been able to post pics from Flickr here before.

But, Length PA/HA 1,1 1,0 243.466 cm = 95 27/32 inches

Without onerous calculations anyone can easily "see" that 243.466 cm = = 2 meters, 43cm, 4.66mm and round that 4.6mm to 5mm's with confidence as 4.6mm and 5mm both convert to 3/16ths of an inch, even with a "base" of 64. It amounts to rounding up 1/64 inch. Once again, my point here is that for carpentry work a metric measure is incredibly easier to use with virtually no loss of accuracy as most tape measures are list only 16th's of an inch, or 32nd's, at best.

[url=http://www.flickr.com/photos/51759584@N07/7202440250/][img]http://farm8.staticflickr.com/7231/7202440250_a16bb8f490_z.jpg[/img][/url] [url=http://www.flickr.com/photos/51759584@N07/7202440250/]3v39ftcm[/url] by [url=http://www.flickr.com/people/51759584@N07/]Kenneth Rhodes[/url], on Flickr

new topic     » goto parent     » topic index » view message » categorize

Search



Quick Links

User menu

Not signed in.

Misc Menu