Форум: "Начинающим";
Текущий архив: 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