Split a/(b+c)

  • Thread starter jobyts
  • Start date
  • #1
201
44

Main Question or Discussion Point

let's say a/b = a/(b'+c)
where b = b'+c.
I need to separate the RHS into a/b' + something. What's that something?
 

Answers and Replies

  • #2
berkeman
Mentor
57,517
7,536
let's say a/b = a/(b'+c)
where b = b'+c.
I need to separate the RHS into a/b' + something. What's that something?
What's the context? Is it just algebraic manipulation?

Something = a/(b'+c) - a/b'

and put over a common denominator?
 
  • #3
201
44
I need to convert x (ranging between 0 - 1,000,000) to y (ranging between 0 - (2^32)-1).

so y = (x * 2^32)/1M => (x << 32)/ 1M

We, the software guys have no problem doing it. But the microcode group says they don't have division operation.
I was trying to provide a solution by converting (x << 32)/ 1M to (x <<32) / ((2^20) + a)
(2^20 is the closest approximation to 1M)

I need to measure the error I'm introducing if I assume a=0.
If possible, I want to come up with a calculation as
(x<<32) /((2^20) + a) => (x << 12) + b.
What is b?
 
  • #4
berkeman
Mentor
57,517
7,536
I need to convert x (ranging between 0 - 1,000,000) to y (ranging between 0 - (2^32)-1).

so y = (x * 2^32)/1M => (x << 32)/ 1M

We, the software guys have no problem doing it. But the microcode group says they don't have division operation.
I was trying to provide a solution by converting (x << 32)/ 1M to (x <<32) / ((2^20) + a)
(2^20 is the closest approximation to 1M)

I need to measure the error I'm introducing if I assume a=0.
If possible, I want to come up with a calculation as
(x<<32) /((2^20) + a) => (x << 12) + b.
What is b?
Do they have a multiply? Just multiply x * 4295

Will that work?
 
  • #5
201
44
Do they have a multiply? Just multiply x * 4295

Will that work?
They have multiply operation for integers. Is it possible to make the approximation independent of x? We can use if-then-else.
 
  • #6
berkeman
Mentor
57,517
7,536
They have multiply operation for integers. Is it possible to make the approximation independent of x? We can use if-then-else.
Not sure what you mean by approximation. That multiplicative factor is pretty exact for doing the scaling that you asked about. Nice integer multiplication...
 
  • #7
129
0
1000000*4295 = 0x1 0000 7FC0
1000000*4294 = 0x0 FFF1 3D80
1000000*1125899906 >> 18 = 4294967292 (0x0 FFFF FFFC)
1000000*2251799813 >> 19 = 4294967294 (0x0 FFFF FFFE)
 
Last edited:
  • #8
201
44
Not sure what you mean by approximation. That multiplicative factor is pretty exact for doing the scaling that you asked about. Nice integer multiplication...
2^32 / 1M = 4,294.967296
We rounded 4,294.967296... to 4295.

So, for higher values of x, the deviation would be high.
 
  • #9
201
44
Thanks Berkeman and Xitami for your answers. Xitami's equation gives pretty accurate results.

Xitami, can you tell how you derived that equation?
 
  • #10
129
0
Code:
PARI/GP >[B]{
K=2^32-1;
T=1000000;
m=K/T;
for(i=0,20,
        n=T*truncate(m*2^i)>>i;
        print(i" "K-n))}[/B]
0 967295
1 467295
2 217295
3 92295
4 29795
5 29795
6 14170
7 6358
8 2452
9 499
10 499
11 10
12 10
13 10
14 10
15 10
16 10
17 3
18 3
19 1
20 1
PARI/GP > [B]truncate(m*2^19)[/B]
%2 = 2251799813
PARI/GP > [B]#binary(truncate(m*2^19)*1000000)[/B]
%3 = 51
51 bits of intermediate result
 
Last edited:

Related Threads on Split a/(b+c)

Replies
3
Views
1K
Replies
7
Views
659
Replies
1
Views
4K
Replies
1
Views
5K
Replies
8
Views
456
Replies
2
Views
3K
Replies
5
Views
2K
Replies
3
Views
516
Replies
3
Views
2K
Top