在C++中安全地重新缩放和向下投射浮点数
Rescaling and downcasting a float safely in C++
我正在尝试R
装箱一个浮点数,我想以无符号的 8 位整数格式获取其权重wt
:
float R;
float edgeVal = rintf(R); // round to the nearest edge
float dR = R - edgeVal + 0.5f; // distance to the edge with a half-pixel offset
unsigned char wt = static_cast<unsigned char>( dR*256.f )); // allowed range [0; 255]
在dR == 0.f
的区间边缘,我们将得到wt=0
,但在dR == 1.f
的另一个边,我们将得到wt = 256
,它将环绕到0,而在这种情况下我们真的很想得到wt = 255
。实现它的正确代码是什么?
下面是变量范围的 2 位示例:
wt = |0|1|2|3|
^ ^
| |
dR = 0 1
如果只有1.0f
的确切值是问题所在,您可能希望首先避免为dR
获取此值。我建议对你的逻辑进行微小的改变,用floor
替换rintf
,其行为在所有情况下都很容易预测,而不受任何外部因素的影响:
float Radj = R + 0.5f;
float edgeVal = floor(R); // now Radj - 1 < edgeVal <= Radj
float dR = Radj - edgeVal; // 0 <= dR < 1
现在原来的
static_cast<unsigned char>( dR*256.f ));
永远不会溢出到 0。
对于一些测试值,原始代码给出了
R edgeVal dR wt
0 0 0.5 128
0.25 0 0.75 192
0.5 0 1 0
0.75 1 0.25 64
1 1 0.5 128
1.25 1 0.75 192
1.5 2 0 0
1.75 2 0.25 64
2 2 0.5 128
而对于floor
,edgeVal
和wt
的值是一致的(以调整前者为代价):
R edgeVal dR wt
0 0 0.5 128
0.25 0 0.75 192
0.5 1 0 0 // note the change here
0.75 1 0.25 64
1 1 0.5 128
1.25 1 0.75 192
1.5 2 0 0
1.75 2 0.25 64
2 2 0.5 128
相关文章:
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- C++浮点数据类型和字符串数据类型无法子到模板函数中
- UE4-如何在给定4个屏幕坐标的情况下缩放纹理或材质
- 计算缩放多边形的比例,得到给定的多边形面积
- QwtPlot具有相等的轴和自动缩放
- 如何在directx/c++中进行平移/缩放操作
- 在Qt中实现无限可缩放的画布
- 是否可以为 QPixmap 派生类嵌入缩放方法?
- 使用提升将数据从 PyObject 复制到浮点数 *
- 使用浮点数和双精度数的非常小数字的数学
- 使用英特尔内联函数将打包的 8 位整数乘以浮点数向量
- 形状对象的旋转和缩放不正确C++
- 如何在 c++ 中将小数点后两位数的浮点数分配给另一个浮点数
- 如何在 OpenSceneGraph 中缩放/旋转/移动资产
- 如何在OpenGL(GLFW,很高兴)中进行2D缩放?
- 返回浮点数的小数位数
- 在 c++ 中缩放浮点值
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 在C++中安全地重新缩放和向下投射浮点数