|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
почему invalid floating-point operation?
Уважаемые участники форума. прошу помочь мне разобраться в следующем моменте:
на вход программы подаю массив из 192400 числовых данных. числовой формат - single с каждым числом необходимо проделать процедуру, чтобы поменять местами байты. в итоге в процессе выполнения программы на этапе переворачивания (свопинга) выскакивает ошибка invalid floating-point operation. если же переворачивать каждое число по отдельности по одному, а не в цикле, то все проходит нормально. пробовал переворачивать отдельно то число на котором вылетает ошибка, и предыдущее число и предшествующее - по отдельности все нормально. а если в цикле, то - беда. в чем дело? Код:
procedure TForm1.btn2Click(Sender: TObject); var ff:TextFile; buf:Single; dd:array [0..3] of byte absolute buf; temp:byte; i:integer; f:TStringList; y:Integer; a:array [0..90035]of Single; begin f:=TStringList.Create; f.LoadFromFile('G:\val.txt'); //setlength(a,192400); // setlength(b,192400); for y:=0 to 90035 do begin a[y]:=StrToFloat(f[y]); end; AssignFile(ff,'e:\antiswap.txt'); Rewrite(ff); //процедура которая переворачивает байты for y:=0 to 90035 do begin buf:=a[y] ; for i:=0 to 1 do begin temp:=dd[i]; dd[i]:=dd[3-i]; dd[3-i]:=temp; end; Writeln(ff,buf); end; CloseFile(ff); f.Free; ShowMessage('конец'); end; во вложенном файле - входные данные. их меньше чем 192400 так как пришлось примерно половину удалить, чтобы загрузить на форум. Последний раз редактировалось Tonyy, 02.06.2013 в 18:00. |
#2
|
||||
|
||||
Во-первых в том файле что ты выложил всего 90036 числа, а значит этот цикл уже будет некорректный:
Код:
for y := 0 to 192399 do begin a[y] := StrToFloat(f[y]); end; |
#3
|
|||
|
|||
да, я извиняюсь, что размер цикла не соответствует файлу задания. просто я уже выложил сначала код, а потом пришлось редактировать файл задание, чтобы его можно было выложить на форуме.
цель не в том, чтобы получить корректное число. а в том, чтобы перевернутые числа записать потом в файл, где они должны храниться перевернутыми. |
#4
|
||||
|
||||
Функция StrToFloat использует системный разделитель целой и дробной части. У тебя в Windows'е скорее всего установлен разделителем запятая, а в том твоём файле разделитель точка - отсюда и ошибка. Используй переменную DecimalSeparator для изменения символа разделителя целой и дробной части.
Цитата:
Цитата:
|
#5
|
|||
|
|||
с разделителем все в порядке. часть чисел он переворачивает. работу прекращает на 553 по счету числе. отдельно и 553 и 554 по счету число переворачивается той же функцией.
|
#6
|
||||
|
||||
Цитата:
|
#7
|
|||
|
|||
это печальная новость.
потому что мне надо массив этих чисел записать в не типизированный файл. при чем числа эти в файле должны храниться в перевернутом виде. а как же мне все таки тогда это сделать? |
#8
|
||||
|
||||
Цитата:
Записывай их в нетипизированный файл как бинарные данные (не интерпретируя в строку). И при чтении читай их как бинарные данные, переворачивай байты и после этого можешь смело использовать в качестве чисел типа Single. |
#9
|
|||
|
|||
Код:
for i:=0 to 192399 do begin Ddata1[i]:=(swapflt(data1[i])+swapflt(data2[i])+swapflt(data3[i]))/(count+1); Ddata1[i]:=swapflt(Ddata1[i]); //вот здесь все равно происходит ошибка end; vs.Write(Ddata1[0],4*192399); это фрагмент кода. swapflt - эта функция которая переворачивает байты. сначала данные берутся из нетипизированных файлов. с ними производятся операции. а затем результат необходимо перевернуть и записать. но происходит ошибка. Последний раз редактировалось Tonyy, 02.06.2013 в 20:54. |
#10
|
||||
|
||||
Цитата:
|
#11
|
|||
|
|||
вполне возможно что swapflt кривая. но лучшей реализации пока не видел.
Код:
function swapflt(value:single):single; var dd:array [0..3] of byte absolute value; temp:byte; i:integer; begin for i:=0 to 1 do begin temp:=dd[i]; dd[i]:=dd[3-i]; dd[3-i]:=temp; end; result:=value; end; |
#12
|
|||
|
|||
Скорее всего происходит ошибка на строке
result:=value; Здесь происходит попытка загрузить из памяти в регистр сопроцессора некорректное число с плавающей точкой. Вывод - не рассматривайте "перевёрнутые" данные как Single. Оставьте их как Cardinal или Array[0..3] of byte. |