• Welcome to TechPowerUp Forums, Guest! Please check out our forum guidelines for info related to our community.

small maths question

Joined
May 27, 2008
Messages
3,577 (1.01/day)
Likes
533
Location
Huddersfield, uk
Processor E8200
Motherboard Asus P5KC
Cooling cooler master hyper tx3, 2x 120mm, 1x 80mm
Memory 4 GB DDR3 OCZ Black Edition
Video Card(s) Gigabyte HD 2600xt silent pipe II
Storage 500GB WD Sata / 60 GB Samsung IDE
Display(s) 20" samusng LCD, gaming at 1680 x 1050
Case some old amd thing
Audio Device(s) onboard
Power Supply 650W
Software Windows 8.1, with 'start is back' obviously
Benchmark Scores It boots whilst im still young so im pleased with that.
#1
Hi all

Sadly maths is not my strongest point so this may seem like a very basic question but hey ho....

I have a range of values from 0-1023 how can i scale them down to 0-127?

Its on a pic board from a pot ive sorted my ADC out, it combines the high and low byte and that's the value range it gives me.

If possible it would be nice to know the equation of how you did it rather then just times by X etc. Then i can use it to control other parameters also.

Many thanks guys n gals
 

RCoon

Gaming Moderator
Staff member
Joined
Apr 19, 2012
Messages
11,406 (5.42/day)
Likes
9,579
Location
Gypsyland, UK
System Name HP Omen 17
Processor i7 7700HQ
Memory 16GB 2400Mhz DDR4
Video Card(s) GTX 1060
Storage Samsung SM961 256GB + HGST 1TB
Display(s) 1080p IPS G-SYNC 75Hz
Audio Device(s) Bang & Olufsen
Power Supply 230W
Mouse Roccat Kone XTD+
Software Win 10 Pro
#2
Found this on the interwebz

Let's say you want to scale a range [min,max] to [a,b]. You're looking for a (continuous) function that satisfies
f(min) = a
f(max) = b

In your case, a would be 1 and b would be 30, but let's start with something simpler and try to map [min,max] into the range [0,1].

Putting min into a function and getting out 0 could be accomplished with
f(x) = x - min ===> f(min) = min - min = 0

So that's almost what we want. But putting in max would give us max - min when we actually want 1. So we'll have to scale it:
x - min max - min
f(x) = --------- ===> f(min) = 0; f(max) = --------- = 1
max - min max - min

which is what we want. So we need to do a translation and a scaling. Now if instead we want to get arbitrary values of a and b, we need something a little more complicated:
(b-a)(x - min)
f(x) = -------------- + a
max - min

You can verify that putting in min for x now gives a, and putting in max gives b.

You might also notice that (b-a)/(max-min) is a scaling factor between the size of the new range and the size of the original range. So really we are first translating x by -min, scaling it to the correct factor, and then translating it back up to the new minimum value of a.
 

W1zzard

Administrator
Staff member
Joined
May 14, 2004
Messages
17,170 (3.43/day)
Likes
18,147
Processor Core i7-4790K
Memory 16 GB
Video Card(s) GTX 1080
Display(s) 30" 2560x1600 + 19" 1280x1024
Software Windows 7
#4
shift is what you want to use as it's the fastest
 

W1zzard

Administrator
Staff member
Joined
May 14, 2004
Messages
17,170 (3.43/day)
Likes
18,147
Processor Core i7-4790K
Memory 16 GB
Video Card(s) GTX 1080
Display(s) 30" 2560x1600 + 19" 1280x1024
Software Windows 7
#6
When working with integer data, don't most of the (good) compilers do this anyway even if you code using arithmetic operator instead of byte/word level shift operations?
yup