浮点转定点:为何采用2^bit_width-2而非2^bit_width-1作为乘数?
为什么浮点转定点时用2bit_width-2而非2bit_width-1?
缓冲浮点精度误差,防止意外溢出
虽然标准IEEE754的1.0f是精确值,但实际业务里很多浮点值是计算出来的近似结果——比如多次累加、除法运算后,结果可能会略大于1.0f(比如1.0000001f)。如果用255当乘数,这个值乘255会得到255.0000255,强制转成uint8_t时,无符号整数溢出会直接绕回成0,完全不符合预期。但用254的话,1.0000001f * 254 ≈254.0254,转完还是254,不会出溢出异常。适配硬件/协议的特殊范围限制
不少硬件或通信协议会把定点数的最大值(比如255)留作特殊用途:比如某些LCD把255当作全屏刷新的控制指令,部分DAC芯片的255是校准触发值,还有些传感器协议里255表示无效数据。这时候实际能用的有效数据范围是0~254,转换时自然就用254当乘数,避免触发硬件的特殊逻辑。有符号定点转换的习惯延续
在有符号定点数场景中,比如8位有符号整数范围是-128~127,要把[-1.0,1.0]的浮点值转过来,通常会用127(也就是2^7-1)当乘数——因为1.0f*128=128.0,转成int8_t会直接溢出(int8_t最大值是127)。这种“用最大值减一避免溢出”的习惯,很容易被带到无符号定点转换的场景里,哪怕无符号本身不会有负向溢出,但开发者会沿用熟悉的安全逻辑。
内容的提问来源于stack exchange,提问作者Zebrafish
相关产品推荐
相关产品推荐

