在保存或舍入數據的同時映射數字比率還有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