首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何转换32位浮点值以将其建模为范围为0-1.0的8位非单一小数值

如何转换32位浮点值以将其建模为范围为0-1.0的8位非单一小数值
EN

Stack Overflow用户
提问于 2011-03-29 06:52:29
回答 2查看 5.5K关注 0票数 2

我有一些浮点引用的C代码。这段代码最终将在DSP处理器(专有)上移植/执行,在该处理器上它将使用无符号8位精度的数据类型,变量的小数值缩放到0-1.0范围内。

对于其他具有16位精度浮点值的DSP目标,我编写了如下代码,将全精度(32位浮点值binary32)转换为半精度(16位浮点值binary16),并对目标进行建模。

代码语言:javascript
运行
复制
I had a function 

float bin32tobin16(float val;)
{
float ret;

val = &= ~(0x1fff);
//I used to loose 13 bits of mantissa of a binary32 float to get a 10 bit mantissa in a binary16 float
}

你明白了吧。

现在,我如何对第二个目标建模,它将使用无符号的8位数据类型(没有可用的浮点数)来表示0-1.0范围内的值。

从binary32位浮点数到无符号8位小数值的转换会是什么样子?

有什么我应该担心的角落案件吗?

任何提示都会很有帮助。

谢谢。

-AD。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-29 23:16:43

首先,在C中没有小数值作为第一类数据类型(我猜您正在使用C...)。您必须决定使用现有的数据类型来表示它,例如,您可以让一个8位无符号整数类型,其范围为0- 255,表示小数值0- 1.0。

此转换可以使用以下命令轻松完成:

代码语言:javascript
运行
复制
unsigned char to_u8(float x)
{
  return x * 255;
}

这里有大量的转角情况:如果值为负值会发生什么?如果它大于1.0呢?如果是NaN呢?你必须决定你的代码是应该返回一个合理的值,还是应该中止。

其次,您发布的代码表明您正在尝试操作浮点数的底层位表示。(很难说,因为代码被严重破坏了。)对于浮点32->浮点16,这将是可行的,假设它们具有相同的符号和指数表示。但是,您通常不能在这里使用相同的方法,因为浮点值和整数的表示方式有很大的不同。

票数 4
EN

Stack Overflow用户

发布于 2011-03-31 17:21:43

@Lindydancer,Gabe:

我想我说得不太清楚,抱歉。我将0到1.0范围内的浮点数( no -ve's,不大于1.0的值)存储在C数据类型float中。现在假设有一个数据类型- unsigned char(8位)精度,它将0到1.0之间的值映射为0到255。

与用户定义的8位无符号数据类型相比,浮点数据tpye可以以更高的精度(明显)来表示更多“更精细”的值,后者用于保存将被解释为小数值(val/ 255)的值。

因此,我的初衷是将这个浮点范围/精度映射到这个新的无符号8位范围/精度,当然,在一些不能用无符号8位类型表示的值中,会有一些数据精度的损失。

为此,我将浮点值映射到这个“新的用户解释/定义的”数据类型,方法是

代码语言:javascript
运行
复制
unsigned char valconv(float val)
{
    unsigned char ret;

    ret = (unsigned char)(val * 255). 
    return ret;      
}

谢谢你的指点。

-AD

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5465966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档