C/C++-如何将有符号32位整数转换为浮点数并返回

C/C++-如何将有符号32位整数转换为浮点数并返回,c++,c,floating-point,int,C++,C,Floating Point,Int,我需要能够将C SInt32整数转换为[-1,1]范围内的浮点数,然后再转换回来。我看过关于24位整数的讨论: 我也试过类似的方法: // Convert int - float SInt32 integer = 1; Float32 factor = 1; Float32 f = integer / (0x7FFFFFF + 0.5); // Perform some processing on the float Process(f); // Scale the float

我需要能够将C SInt32整数转换为[-1,1]范围内的浮点数,然后再转换回来。我看过关于24位整数的讨论:

我也试过类似的方法:

 // Convert int - float
 SInt32 integer = 1;
 Float32 factor = 1;
 Float32 f = integer / (0x7FFFFFF + 0.5);

 // Perform some processing on the float
 Process(f);

 // Scale the float
 f = f * factor;

 // Convert float - int
 integer = f * (0x7FFFFFF + 0.5);
然而,这不起作用。我知道它不起作用,因为我正在做的工作涉及音频编程,转换会导致嘶嘶声

我很确定这是一个转换问题,因为当我通过将因子设置为0.0001使浮动变小时,裂纹消失。也许反向转换使int超出了它的限制,并导致它被截断

如有任何建议,将不胜感激。

请仔细阅读。仅支持24位有效位,因此如果您转换32位整数,将丢失低位8位。

请继续阅读。仅支持24个有效位,因此,如果转换32位整数,将丢失低8位

const float recip = 1.0 / (32768.0*65536.0);
// hope that compiler will calculate this in advance
// From the expression an semi-advanced programmer can also immediately spot
// where the value comes from
float value = int_value * recip;
int value2 = value * (32768.0*65536.0);
这个过程是不可逆的:一个人可能会失去多达7位的准确度


这个过程是不可逆的:一个人可能会丢失多达7位的精度。

谢谢,所以我需要使用24位int。@BenSmiley或convert to double,这通常会给你53位的精度。谢谢,所以我需要使用24位int。@BenSmiley或convert to double,这通常会给你53位的精度。与这些值相乘并不完全是OP想要的:都包括+-1,其中as整数的范围为[-2^n..2^n-1],但与2^n-1相乘或相除会产生稍多的噪声。问题表明浮点值可能为1。“[-1,1]”表示闭合区间;它包括它的端点。value2的计算将把值中的1转换为2147483648,这会溢出一个有符号的32位整数。@EricPostSchil-是的,我注意到了。幸运的是,浮点1.0*2^31作为整数不会溢出,但根据IEEE-754标准,它会饱和到最大值。我认为剪辑一个稀有样本比在其他样本中引入量化噪声更好。IEEE 754-2008在第7.2条中说,当源超出目标范围时,转换为整数会导致无效操作异常。2011年C标准在第F.4条中规定,提出了无效操作异常,结果未指定。如果C实现不支持附录F(许多人不支持),则第6.3.1.4条规定行为未定义。-1,这不仅会丢失多达7位。。它能把所有的碎片都弄松。假设int为32位,float=1.0*32768.0*65536.0,将溢出,值将变为负值:INT32_MIN。与这些值相乘并不完全是OP想要的:包括两个+-1,其中as整数的范围为[-2^n..2^n-1],但是乘以或除以2^n-1会产生稍多的噪声。问题表明浮点值可能为1。“[-1,1]”表示闭合区间;它包括它的端点。value2的计算将把值中的1转换为2147483648,这会溢出一个有符号的32位整数。@EricPostSchil-是的,我注意到了。幸运的是,浮点1.0*2^31作为整数不会溢出,但根据IEEE-754标准,它会饱和到最大值。我认为剪辑一个稀有样本比在其他样本中引入量化噪声更好。IEEE 754-2008在第7.2条中说,当源超出目标范围时,转换为整数会导致无效操作异常。2011年C标准在第F.4条中规定,提出了无效操作异常,结果未指定。如果C实现不支持附录F(许多人不支持),则第6.3.1.4条规定行为未定义。-1,这不仅会丢失多达7位。。它能把所有的碎片都弄松。假设int为32位,float=1.0*32768.0*65536.0,将溢出,值将变为负值:INT32_MIN。