Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.11.04;
Скачать: CL | DM;

Вниз

0,146 <> 0,146!!!   Найти похожие ветки 

 
Ярослав   (2007-10-15 00:30) [0]

Здравствуйте.
Есть код:

j := 0.001;
     while (условие) do
     begin
       symbPos := form1.arraySearch(freq, symbFreq[i] + j);
       if (symbPos <> 0) then
         symbCharacter[i] := lowerLetters[symbPos]
       else
       begin
         symbPos := form1.arraySearch(freq, symbFreq[i] - j);
         if (symbPos <> 0) then
           symbCharacter[i] := lowerLetters[symbPos];
       end;
       j := j + 0.001;
     end;

Код зацикливается когда наступает значение symbFreq[i] - j равным 0,146. Функция arraySearch его не находит

function TForm1.arraySearch(a: array of Real; val: real): integer;
 var i: integer;
begin
 Result := 0;
 for i := 0 to length(a) - 1 do
 begin
   if (a[i] = val) then //вот здесь не срабатывает хотя когда я смотрю в дебагене то a[i] и val равны 0,146
   begin
     Result := i;
     Break;
   end;
 end;
end;


Оптимизацию отключил
Подскажите как можно полечить


 
Dimaxx ©   (2007-10-15 00:33) [1]

Попробовать объявить вместо Real Double. Эта фича из-за потери точности. 0,001 в real на самом деле будет не 0,001, а чуть меньше.


 
Ярослав   (2007-10-15 00:42) [2]

a[i]: 0,146
val: 0,146
if (a[i] = val) then //не заходит сюда
Real изменил на Double


 
Германн ©   (2007-10-15 00:47) [3]


> Ярослав   (15.10.07 00:30)

http://www.delphikingdom.com/asp/viewitem.asp?catalogid=374
Читать до полного просветления.


 
Юрий Зотов ©   (2007-10-15 00:52) [4]

http://www.delphikingdom.com/asp/viewitem.asp?catalogid=374


 
Ярослав   (2007-10-15 01:08) [5]

Статью прочитал но не во все вникал подробно
Меня немного сбило с толку что дебагер показал одинаковые значения, ну да ладно.
Решил временно тупым способом
  val := round(val * 1000) / 1000;
   a[i] := round(a[i] * 1000) / 1000;
Подскажите как решить по человечески
Спасибо


 
Германн ©   (2007-10-15 01:12) [6]


> Подскажите как решить по человечески

Тогда расскажи про задачу. Что именно нужно, для чего и по каким причинам? В каких-то случаях твоё решение вполне "человеческое".


 
Ярослав   (2007-10-15 01:18) [7]

есть числа в масиве
 var freq: array [1..36] of Double = (0.002, 0.015, 0.168...);
у меня есть число припустим 0.013
мне нужно найти с масива число, которое наиболее ближе к нему
я делаю это while и додаю и отнимаю 0,001
тоисть после первой итерации у меня будет 0,012 : 0.014
вторая итерация 0,011 : 0.015
тоисть ближе число 0,015 что надо было получить
так вот проблема в том сравнении


 
Германн ©   (2007-10-15 01:30) [8]


> мне нужно найти с масива число, которое наиболее ближе к
> нему
>

Да. Статью не читал, кроме названия. :-)
Определись с точностью, которая нужна для выполнения критерия
> наиболее ближе к нему
. Например 0.0001. (Только не спрашивай откуда я эту константу взял. Сам поймёшь, когда найдёшь время прочитать статью).
Тогда сравнивай разницу. if Abs(a[i]- val) < 0.0001 then

P.S. Ну и прекрати, наконец использовать имя стандартной процедуры Паскаля в качестве имени своей переменной!


 
Ярослав   (2007-10-15 01:36) [9]

Спасибо

> P.S. Ну и прекрати, наконец использовать имя стандартной
> процедуры Паскаля в качестве имени своей переменной!
>

Больше не буду :(


 
Германн ©   (2007-10-15 01:43) [10]


> Германн ©   (15.10.07 01:30) [8]

А в константе я кстати написАл лишний ноль после запятой. :-(


 
Германн ©   (2007-10-15 02:13) [11]

Объяснение задачи в [7], пример решения задачи в [0], пример решения задачи в [8] и "Спасибо" в [9] - ну никак не соответствуют друг другу. :-)

P.S. Разделался со своей работой, теперь смог взглянуть на форум "другими" глазами.

P.P.S Ну кажись автор сабжа понял основную причину.


 
homm ©   (2007-10-15 06:10) [12]

> [5] Ярослав   (15.10.07 01:08)
> Меня немного сбило с толку что дебагер показал одинаковые
> значения

Уверен? ctr+alt+F


 
homm ©   (2007-10-15 06:20) [13]

> [7] Ярослав   (15.10.07 01:18)
> есть числа в масиве
> var freq: array [1..36] of Double = (0.002, 0.015, 0.168...);
> у меня есть число припустим 0.013
> мне нужно найти с масива число, которое наиболее ближе к
> нему

const
 N = 3;
var
 freq: array [0..N] of Double = (0.002, 0.015, 0.168, 0.455);

procedure TForm1.Button1Click(Sender: TObject);
const
 Znacheneie: Double = 0.013;
var
 i: Integer;
 El: Integer;
begin
 El := 0;
 for i := 1 to N do begin
   if abs(freq[i] - Znacheneie) < abs(freq[El] - Znacheneie) then
     El := i;
 end;

 ShowMessage("Most near Value is: freq["+IntToStr(El)+"] := "+FloatToStr(freq[El]));
end;


 
palva ©   (2007-10-15 10:50) [14]

Может быть, будет полезна функция SameValue из модуля Math


 
homm ©   (2007-10-15 11:18) [15]

> [14] palva ©   (15.10.07 10:50)
> Может быть, будет полезна функция SameValue из модуля Math

Для задачи, описаной в [7] — бесполезна, а в [0] — вообще бред какой-то.



Страницы: 1 вся ветка

Текущий архив: 2007.11.04;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.018 c
15-1190956669
Dmitry S
2007-09-28 09:17
2007.11.04
Фильтр DHCP


2-1191920499
r.o.o.t
2007-10-09 13:01
2007.11.04
Закрытие формы


15-1190864226
azamatufa
2007-09-27 07:37
2007.11.04
Про работу форума


15-1191529424
cber
2007-10-05 00:23
2007.11.04
Задача по тер-веру


15-1190822043
Dark Lord
2007-09-26 19:54
2007.11.04
Недостаточно памяти для обработки команды