Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.11.04;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.049 c
15-1190924869
Petr V. Abramov
2007-09-28 00:27
2007.11.04
OEM XP


1-1187688195
Alex.rus
2007-08-21 13:23
2007.11.04
Как получить доступ к свойствам компонента расположенном на друго


15-1191089731
lookin
2007-09-29 22:15
2007.11.04
Скорость удаления данных из памяти


2-1191985954
O.O
2007-10-10 07:12
2007.11.04
Запуск программ


3-1182619806
vegarulez
2007-06-23 21:30
2007.11.04
Ошибка при записи в БД (ругань на ; в конце строки)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский