如何处理浮点溢出?

时间:2013-04-24 05:12:08

标签: delphi floating-point delphi-7

我正在尝试使用HAAR公式过滤.wav样本数据值,但得到错误“浮点溢出”

已编辑:添加更多代码

numsamples := round(wavehdr.SampleRate);
SetLength(wavedata[0].Data, numsamples);
Stream.Read(wavedata[0].Data[0], numsamples);
SetLength(cA1, numsamples);
SetLength(cD1, numsamples);
for i:=1 to numsamples-1 do begin 
cA1[i]:=(wavedata[0].Data[(i*2)-1]*0.7071) + (wavedata[0].Data[(i*2)]*0.7071);
cD1[i]:=(wavedata[0].Data[(i*2)-1]*0.7071) + (wavedata[0].Data[(i*2)]*-0.7071);
end;

其中wavedata [0] .Data [i],我从函数Stream.Read得到它来加载.wav文件的样本数据值。我不知道为什么我得到错误或错误意味着什么,我一直在搜索错误,主要是由于零的分裂造成的,但我的代码中没有零除零。所以也许我可以在这里帮助我的代码中的错误意味着什么?

编辑1 :(我真的很新的delphi,这个代码不是我的,我发现它是互联网。在我的理解下,以下代码是一个读取.wav文件样本数据值)

type
  TWaveHeader = packed record

    Marker_RIFF: array [0..3] of char;
    ChunkSize: cardinal;


    Marker_WAVE: array [0..3] of char;


    Marker_fmt: array [0..3] of char;
    SubChunkSize: cardinal;


    FormatTag: word;

    { nChannels : 1  mono, 2  stereo }
    NumChannels: word;
    SampleRate: longint;
    BytesPerSecond: longint;
    BytesPerSample: word;
    BitsPerSample: word;


    Marker_data: array [0..3] of char;


    DataBytes: longint;
  end;

  TChannel = record

    Data : array of double;
  end;

私人声明:

private
    wavehdr:TWaveHeader;

功能:

FillChar(wavehdr, sizeof(wavehdr),0);
Stream.Read(wavehdr,sizeof(wavehdr));

我修改了一些代码以在读取样本数据时处理空值:

 if(IsNan(wavedata[0].Data[(i*2)-1])) then begin
      wavedata[0].Data[(i*2)-1]:=0;
    end
    else if(IsNan(wavedata[0].Data[(i*2)]))  then begin
      wavedata[0].Data[(i*2)]:=0;
    end;

3 个答案:

答案 0 :(得分:6)

代表i:=0 ...

(wavedata[0].Data[(i*2)-1]

你真的有数组元素Data[-1]吗?

P.S。调试时设置范围检查编译器选项。

修改:我看到了一些新代码,让我们继续第2步:

SetLength(wavedata[0].Data, **numsamples**);

for i:=1 to **numsamples**-1

wavedata[0].Data[(**i*2)**]

我们是否要彻底检查每一行代码?

答案 1 :(得分:4)

当表达式产生的值不适合在其中计算表达式的数据类型的范围内时,会发生溢出。正数和负数都可能出现溢出。

如果输入值已经接近溢出浮点值,则您的特定表达式将仅导致溢出。因此,如果您使用双精度值,那么只有输入数据的大小约为1e308时,您的代码才会溢出。

您的输入数据似乎不太可能是那种形式。所以我猜你的问题与你如何阅读输入数据有关。我怀疑你读的不正确,所以最终对无意义的值进行算术运算。

答案 2 :(得分:0)

在我尝试这个并且我弄清楚自己的错误之后,感谢@MBo你的回答缩小了循环中的焦点,这对我来说真的很愚蠢。循环应该像

for i:=0 to round(numsamples/2) do begin

问题不是元素Data [-1]但是,如果数组wavedata = X的长度,那么我试图到达[X * 2]的元素,这些元素不可用它肯定会在一半之后导致错误。例如阵列[4]但我试图到达阵列[4 * 2]这是不可用的(抱歉我的英文不好,我不知道我的解释是否好)但感谢大家的帮助:D