We help IT Professionals succeed at work.

Check out our new AWS podcast with Certified Expert, Phil Phillips! Listen to "How to Execute a Seamless AWS Migration" on EE or on your favorite podcast platform. Listen Now

x

# muldiv64 on small cpu's

on
Medium Priority
461 Views
Hi.

I have a small problem.

I need to calculate  x =  (a*b)/c.

Problem is, that a,b and c are 32 bit long, and the machine doesn't have a 64/32 bit division. The code the compiler generates in this case is ugly and slow (yep, it's time-critical). Does anyone has an idea how to do a fast version with 2 or maybe 4 ordinary 32/32 divisions?

Nils Pipenbrinck

(P.S. Please don't quote ugly c-code from the gnu lib)
Comment
Watch Question

## View Solution Only

Commented:
Hello !

You use
x = (a/c)*b;    /* Instead of x = (a*b)/c; */

Commented:
>> x = (a/c)*b;
Which will give you an incorrect result due to premature rounding

Commented:
sganter, as alexo already said.. this will give incorrect results.

nils

Commented:
Hello !
x = (a/c)*b;    /* Instead of x = (a*b)/c; */
is correct because
First it will get the result for a/c since it is in the paranthesis.
i.e., 32bit/32 bit division, result will be 32 bit only

Then it will take the result and multiply with b.

The equivalent statement in the assembly language is like this
MOVE value_of_a to AX
DIV AX,value_of_c /* AX contains the RESULT of A/C */
MUL AX,value_of_b /*AX  contains the FINAL RESULT  */

You test this program. Here it works. If it does'nt work, I don't mind.
CERTIFIED EXPERT
Most Valuable Expert 2014
Top Expert 2015

Commented:
(a/c)*(b/c)*c+a/c*(b%c)+b/c*(a%c)+(a%c)*(b%c)/c

Commented:
x = (a/c)*b;    /* Instead of x = (a*b)/c; */

a = 1
b = 1000
c = 2

x = (a/c)*b would give:

(1/2) * 1000
= 0 * 1000
= 0

while my formula gives:

x = (a*b)/c

(1*1000)/2 = 500

your substitution won't give the correct results in this case.
anyways  we  found a fast way to solve this problem.

Thank you.

(just answer again, I reopend the question for 50 points. then 'll give you the 50 points for your work.)
Commented:
Unlock this solution and get a sample of our free trial.
(No credit card required)
Unlock the solution to this question.