Floating point 从ByteArray读取的浮点值似乎错误/不合理

Floating point 从ByteArray读取的浮点值似乎错误/不合理,floating-point,precision,actionscript,Floating Point,Precision,Actionscript,上下文: 我在AS3中开发的应用程序需要一个音频库,它可以将多个音频文件混合到一个音频文件中,应用淡入淡出、缩短音频、循环并用空噪波填充。在做了一天的研究之后,我在AS3中找不到任何合适的库可以这样做,所以我开始开发自己的库 该库的功能是直接处理波形的浮点值,即我使用Sound.extract()将MP3转换为波形。任何提取都是在小块中完成的,以避免过度使用内存。除了混合过程,库的大部分功能(剪辑、淡入、剪切、循环、填充)都可以正常工作 问题: mix函数接受任意数量的源(ByteArray持有

上下文: 我在AS3中开发的应用程序需要一个音频库,它可以将多个音频文件混合到一个音频文件中,应用淡入淡出、缩短音频、循环并用空噪波填充。在做了一天的研究之后,我在AS3中找不到任何合适的库可以这样做,所以我开始开发自己的库

该库的功能是直接处理波形的浮点值,即我使用
Sound.extract()
将MP3转换为波形。任何提取都是在小块中完成的,以避免过度使用内存。除了混合过程,库的大部分功能(剪辑、淡入、剪切、循环、填充)都可以正常工作

问题: mix函数接受任意数量的源(ByteArray持有一个32位浮点序列),读取所有浮点,将它们相加,并将结果写入输出,然后在超出范围(1.0,-1.0)时对输出进行剪裁,如本文所述:

以下是混合函数:

public function mix(sources:Vector.<ByteArray>):ByteArray
{           
    var mixedBA:ByteArray = new ByteArray();
    var expectedLengthInBytes:uint = sources[0].length;
    var floats:Vector.<Number>;
    var floatSum:Number;

    for each (var byteArray:ByteArray in sources)
    {
        byteArray.position = 0;

        if (byteArray.length != expectedLengthInBytes)
        {
            throw new Error("Parameter sources are not all the same length (bytes)!");
        }
    }

    var floatCount:uint = expectedLengthInBytes / FLOAT_SIZE_IN_BYTES;

    for (var i:uint = 0; i < floatCount; i++) 
    {
        floats = new Vector.<Number>();
        floatSum = 0;

        for each (var source:ByteArray in sources)
        {
            floats.push(source.readFloat());
        }

        for each (var float:Number in floats)
        {
            floatSum += float;
        }

        mixedBA.writeFloat(floatSum);
    }

    var clippedBA:ByteArray = clip(mixedBA);

    return clippedBA;
}
公共函数组合(来源:Vector.):ByteArray
{           
var mixedBA:ByteArray=newbytearray();
var expectedLengthInBytes:uint=sources[0]。长度;
变量浮动:向量。;
var floatSum:数字;
对于每个(变量byteArray:源中的byteArray)
{
byteArray.position=0;
if(byteArray.length!=预期长度单位)
{
抛出新错误(“参数源的长度(字节)不尽相同!”;
}
}
var floatCount:uint=expectedLengthInBytes/浮点大小(以字节为单位);
对于(变量i:uint=0;i
这只适用于少数几个音源,但当您开始将大量声音混合在一起时,
ByteArray.readFloat()
函数似乎开始返回错误的浮点值,远远超出范围,从-7000.00000到1.1237128321E128(AS3似乎解释为1123712832131)到56869.0000(您知道了)

问题: 根据Adobe docs
ByteArray.readFloat()
返回一个32位浮点值,但将其存储在一个表示64位浮点值的数字中。此外,
ByteArray.writeFloat()
还写入32位浮点,但同样采用表示64位浮点的数字


这种精度转换会产生这些极值吗?或者我找错地方了,而实际上,
Sound.extract()
中有错误(似乎不太可能,因为我提到只混合几个声音就可以了)

试着打印出字节的十六进制值,无论是在“混合”之前还是之后。(如果您仍希望保留此问题,请将此信息包含在问题中。)另外,请阅读IEEE浮点表示法。对于数值运算,输入值必须是正确的类型,运算结果才有意义。如果不知道二进制表示(十六进制值),当前形式的问题是无法回答的。不正确的浮点值只表明存在问题,但无助于解决问题。字节数组从何而来?你有没有可能遇到大/小endian问题?