Log inRegister an accountBrowse CSDbHelp & documentationFacts & StatisticsThe forumsAvailable RSS-feeds on CSDbSupport CSDb Commodore 64 Scene Database
You are not logged in - nap
CSDb User Forums


Forums > C64 Coding > Fractional Scaling - Math problem
2012-02-05 08:06
TWW

Registered: Jul 2009
Posts: 545
Fractional Scaling - Math problem

Alright.

Say you got the fraction 44/93.

Then you want to scale it to a predetermined denominator of 128 which would give: 61/128 (rounded).

61 is found by calculating 44*128/93.

One multiplication and a division is a bit heavy if you plan to do real-time stuff.

The fastest way I have come up with so far is this:

Set up a 16 bit index table for 1-128 which gives the scaling factor of the denominator (i.e. 1,376 for 128/93). 7 bits for the whole number (1-128) and 9 bits for the decimals giving some accuracy.

Then multiply this with the original numerator to get the scaled numerator.

Still stuck with a small lookup-table (256b) and a 16 by 8 bit multiplication.

Any suggestions on how to do this faster (without spending 16k on a lookuptable)?
 
... 14 posts hidden. Click here to view all posts....
 
2012-02-05 20:39
WVL

Registered: Mar 2002
Posts: 902
Maybe you're looking at it the wrong way, being too fixed at this scaling problem. Maybe there's another way to do your calculation, skipping this problem.

It helps if we'd know what you're trying to do :)
2012-02-07 15:24
TWW

Registered: Jul 2009
Posts: 545
~8K table was what I needed and a little indexed magic. an ok comprimise between speed and memory.

I can't tell you what it's for coz that will ruin the surprise no 8-)
2012-02-07 15:34
chatGPZ

Registered: Dec 2001
Posts: 11386
i have abused the table-of-squares multiplikation idea to scale a number in 0-127 range.... (this) instead of using (x^2)/4 simply use (x^2)/2 for the table(s). then the highbyte of the result is your scaled value. seems slightly slower than with an 8k table, but uses much less memory :) (this would actually be an 1.7 fixedpoint multiplication)
2012-02-07 18:42
WVL

Registered: Mar 2002
Posts: 902
does your demoninator change a lot? or is it fixed for say a whole frame? I gots me an idea..
2012-02-07 20:04
TWW

Registered: Jul 2009
Posts: 545
Well.. It changes and it's async. to the frame but what did you have in mind?
2012-02-07 21:41
WVL

Registered: Mar 2002
Posts: 902
Well, i remembered a routine i wrote in arcanum, it also kinda scales fractions, but not quite. I think it would maybe work if the scaling factor doesnt change a lot.

So, how often (after how many scalings) does the scaling factor (original demoninator) change?
2012-02-08 00:45
TWW

Registered: Jul 2009
Posts: 545
Well to tel lthe truth it's any combination of numbers between 1/1 -> 127/127 which get's scaled into xx/255.

There is no pattern or easy way to predict the next fraction unless I make a seperate routine for all the calculations (which will suck mem).
2012-02-08 07:51
JackAsser

Registered: Jun 2002
Posts: 2014
Quote: Well to tel lthe truth it's any combination of numbers between 1/1 -> 127/127 which get's scaled into xx/255.

There is no pattern or easy way to predict the next fraction unless I make a seperate routine for all the calculations (which will suck mem).


numerator´ = numerator * table[denominator]

A 8.8 fixpoint table with 128 entries should be sufficient.

table[x] = round((128/x)*256)

Then use this http://codebase64.org/doku.php?id=base:seriously_fast_multiplic.. to multiply fast.
2012-02-08 15:47
TWW

Registered: Jul 2009
Posts: 545
Quote: numerator´ = numerator * table[denominator]

A 8.8 fixpoint table with 128 entries should be sufficient.

table[x] = round((128/x)*256)

Then use this http://codebase64.org/doku.php?id=base:seriously_fast_multiplic.. to multiply fast.


I'm trying to wrap my head around your post.

If the original denuminator is say 10 then calculating:

table[10] = round((128/10)*256) = 3277

If we then put this into:

numerator' = round(numerator * table[denominator]);0 // 0 decimals

I don't see how this gives the new numinator? I think I must have missunderstood you here.



I did some calculations and found that:

table[x] = round(256/denominator);3 // 3 decimals

then:

numerator' = numerator * table[x]

will give an accurate result. Looks like we're not getting around the 16 bits when doing the FP multiplication though. what will that do to the mult. tables?
2012-02-08 18:42
JackAsser

Registered: Jun 2002
Posts: 2014
Quote: I'm trying to wrap my head around your post.

If the original denuminator is say 10 then calculating:

table[10] = round((128/10)*256) = 3277

If we then put this into:

numerator' = round(numerator * table[denominator]);0 // 0 decimals

I don't see how this gives the new numinator? I think I must have missunderstood you here.



I did some calculations and found that:

table[x] = round(256/denominator);3 // 3 decimals

then:

numerator' = numerator * table[x]

will give an accurate result. Looks like we're not getting around the 16 bits when doing the FP multiplication though. what will that do to the mult. tables?


You said:

Quote:

Say you got the fraction 44/93.

Then you want to scale it to a predetermined denominator of 128 which would give: 61/128 (rounded).

61 is found by calculating 44*128/93.


Hence 61 is found by calculating numerator*128/denominator

Basically you multiply by 1/x (in your case 128/x because you need that scale) which is same as dividing by x in the first place.

Regarding 16-bit multiplications using square sum tables, no problems, check out the wiki article.

/Andreas
Previous - 1 | 2 | 3 - Next
RefreshSubscribe to this thread:

You need to be logged in to post in the forum.

Search the forum:
Search   for   in  
All times are CET.
Search CSDb
Advanced
Users Online
Metal Maniac/Dual Crew
csabanw
Operator Teleksu
algorithm
El Jefe/Slackers^sidD
Dan
MWR/Visdom
McGurk/Coma
Xiny6581/Dees Produc..
Morpheus/IPC+C64.COM
E$G/HF ⭐ 7
Guests online: 111
Top Demos
1 Next Level  (9.7)
2 13:37  (9.7)
3 Mojo  (9.7)
4 Coma Light 13  (9.6)
5 Edge of Disgrace  (9.6)
6 What Is The Matrix 2  (9.6)
7 The Demo Coder  (9.6)
8 Uncensored  (9.6)
9 Comaland 100%  (9.6)
10 Wonderland XIV  (9.6)
Top onefile Demos
1 Layers  (9.6)
2 No Listen  (9.6)
3 Cubic Dream  (9.6)
4 Party Elk 2  (9.6)
5 Copper Booze  (9.6)
6 Dawnfall V1.1  (9.5)
7 Rainbow Connection  (9.5)
8 Onscreen 5k  (9.5)
9 Morph  (9.5)
10 Libertongo  (9.5)
Top Groups
1 Performers  (9.3)
2 Booze Design  (9.3)
3 Oxyron  (9.3)
4 Triad  (9.3)
5 Censor Design  (9.3)
Top Graphicians
1 Mirage  (9.8)
2 Archmage  (9.7)
3 Pal  (9.6)
4 Carrion  (9.6)
5 Sulevi  (9.6)

Home - Disclaimer
Copyright © No Name 2001-2024
Page generated in: 0.058 sec.