【发布时间】:2011-02-05 09:34:24
【问题描述】:
我正在开发一个没有数学库的平台,所以我需要构建自己的工具。我目前获取分数的方法是将浮点数转换为定点(乘以 (float)0xFFFF,强制转换为 int),仅获取下部(掩码为 0xFFFF)并再次将其转换回浮点数。
但是,不精确正在杀死我。我正在使用我的 Frac() 和 InvFrac() 函数来绘制抗锯齿线。使用modf 我得到了一条非常平滑的线。使用我自己的方法,由于精度损失,像素开始跳动。
这是我的代码:
const float fp_amount = (float)(0xFFFF);
const float fp_amount_inv = 1.f / fp_amount;
inline float Frac(float a_X)
{
return ((int)(a_X * fp_amount) & 0xFFFF) * fp_amount_inv;
}
inline float Frac(float a_X)
{
return (0xFFFF - (int)(a_X * fp_amount) & 0xFFFF) * fp_amount_inv;
}
提前致谢!
【问题讨论】:
-
fp_amount 不应该是 0x10000 而不是 0xFFFF?
-
天哪。让它成为一个答案,这样我就可以接受它!你刚刚解决了我的整个准确性问题!
-
如果评论修复了为什么没有人编辑原始代码?
标签: c++ c math bit-manipulation