在保存或舍入数据的同时映射数字比率还有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]
在保存或舍入数据的同时映射数字比率还有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]
乘以255然后除以30000.使用整数格式可以保存两个范围限制的乘积,30000 * 255或765万。这可以避免中间浮点值的精度问题。
并且可能会添加偏差(偏移量),因为整数除法舍去而不是舍入。例如'val =(cdp * 255 + 15000)/ 30000;' – 2011-12-30 21:51:41
可以使用一个简单的线性插值来做到这一点,如果我理解正确。它会这样工作:
x = inValue/(maxInRange - minInRange);
result = minOutRange + (maxOutRange - minOutRange) * x
其中inValue是您的示例中30,000的数字。 minInRange = 0,maxInRange = 30,000,minOutRange = 0,maxOutRange = 255。
如果你想四舍五入到最接近的价值,而不是截断任何小数部分,那么你必须这样做:
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.
什么是错的方式给出的片段不是吗? – Griwes 2011-12-30 21:40:43
将问题从“好方法”改为“更好的方式” – grep 2011-12-30 21:44:45