2011-12-30 102 views
2

在保存或舍入数据的同时映射数字比率还有C或C++中的更好的方法,还是一般的数学方法?C++'map'数字范围

看看下面的例子

double cdp = 17000.0;  
float integ = 30000.0/255; 
int val = cdp/integ; 

color = color + RGB(val, val, val); 

在这里,我想的数字范围[0,30000]映射到的值[0,255]

+2

什么是错的方式给出的片段不是吗? – Griwes 2011-12-30 21:40:43

+0

将问题从“好方法”改为“更好的方式” – grep 2011-12-30 21:44:45

回答

7

乘以255然后除以30000.使用整数格式可以保存两个范围限制的乘积,30000 * 255或765万。这可以避免中间浮点值的精度问题。

+4

并且可能会添加偏差(偏移量),因为整数除法舍去而不是舍入。例如'val =(cdp * 255 + 15000)/ 30000;' – 2011-12-30 21:51:41

6

可以使用一个简单的线性插值来做到这一点,如果我理解正确。它会这样工作:

x = inValue/(maxInRange - minInRange); 
result = minOutRange + (maxOutRange - minOutRange) * x 

其中inValue是您的示例中30,000的数字。 minInRange = 0,maxInRange = 30,000,minOutRange = 0,maxOutRange = 255。

2

如果你想四舍五入到最接近的价值,而不是截断任何小数部分,那么你必须这样做:

double prod = cpd * 255; //double is big enough to hold the product without loss of precision 
val = (int)(prod/30000 + 0.5); //Adding 0.5 turns truncation into rounding.