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

Вниз

Варианты решения задачи сравнения вещественных чисел.   Найти похожие ветки 

 
Zheksik ©   (2008-01-08 11:03) [0]

Прочитал статью посвящённую этой теме и пришёл к выводу, что должен быть не один вариант решения этой задачи. Мой вариант - это умножение до получения целого числа. Какие ещё есть варианты?


 
Плохиш ©   (2008-01-08 11:11) [1]

Рекомендую перечитать статью ещё несколько раз, но уже думая...


 
Zheksik ©   (2008-01-08 11:14) [2]

Т.е. обсуждению не подлежит??? Или просто не в этом форуме???


 
Anatoly Podgoretsky ©   (2008-01-08 11:41) [3]

> Zheksik  (08.01.2008 11:14:02)  [2]

Это не в этой галактике. Читай статью вдумчиво
А для начала одна школьная формула

a/b=(a/b)*b

1/3 = (1/3)*3


 
Malina   (2008-01-08 13:28) [4]


> 1/3 = (1/3)*3

И что она показывает?


 
Правильный_Вася   (2008-01-08 13:34) [5]

сравнение вещественных чисел всегда с какой-то точностью, обусловленной задачей или ограничениями железа, т.е.
X-Y<0.00001


 
Anatoly Podgoretsky ©   (2008-01-08 13:43) [6]

> Malina  (08.01.2008 13:28:04)  [4]

А калькулятор у тебя есть?


 
Malina   (2008-01-08 13:50) [7]


> А калькулятор у тебя есть?

Есть
1/3 показывает 0.3333333 а  (1/3)*3=1
И в чем подвох?


 
Palladin ©   (2008-01-08 13:57) [8]

Анатоль обшибся :)

a=(a/b)*b

1=(1/3)*3


 
sniknik ©   (2008-01-08 13:59) [9]

тут точнее будет
a <> (a/b)*b
вернее не всегда равно
1  <> (1/3)*3

и кстати калькулятор не поможет... ;о), виндовым во всяком случае, он скрадывает погрешности.
только вычисление на бумажке, только руками! причем точное! вот когда на тысяча двадцать шестом знаке скажет "да ну его нафиг" тогда и поймет... может быть.


 
sniknik ©   (2008-01-08 14:00) [10]

> И в чем подвох?
программный округляет очень уж малые величины.


 
Дуболом   (2008-01-08 14:07) [11]

> Мой вариант - это умножение до получения целого числа.

Умножение чего? Умножение на что?

> Malina   (08.01.08 13:50) [7]

Тут с подвохом трудно. Но вот тут в полный рост:

x := random;

while 2=2 do begin
x := frac(2*x);
writeln(x);
end;

x := random;

while 3=3 do begin
x := frac(3*x);
writeln(x);
end;


 
Malina   (2008-01-08 14:24) [12]


> Анатоль обшибся :)

а-а-а теперь все точки над и расставлены четко )


 
Zheksik ©   (2008-01-08 15:38) [13]


> Это не в этой галактике.

Теперь вижу )))

Можно съехать на тонкость мысли или галактический обстрактный код.


 
Zheksik ©   (2008-01-08 15:45) [14]

ох вы тут в арифметику ударились... скоро олимпиада что ли???

проблема в том, что имея цикл, закрывающийся как только некая вещественная переменная станет равна другой вещественной переменной, этого же типа, нет гарантии, что он закроется т.к 0.25 <> 0.250000001, предположим...

Как по мне, то проще всего в этой ситуации умножать и то и другое число на 100 и отбрасывая остаток сравнивать эти числа, но кажется это не совсем правильный вариант, вот я и хотел поинтересоваться, что по этому поводу думают профессионалы...


 
Германн ©   (2008-01-08 15:49) [15]


> Как по мне, то проще всего в этой ситуации умножать и то
> и другое число на 100

А с какого потолка выбрано именно 100? Когда ответишь на этот вопрос, тогда и найдешь правильный вариант.


 
Zheksik ©   (2008-01-08 16:00) [16]

[15]

> А с какого потолка выбрано именно 100?

В моём случае точность определяется сотыми долями числа, поэтому остаток роли не играет...

Кстати именно из-за неуниверсальности этого метода хочу узнать более правильный вариант решения этой задачи.


 
Leonid Troyanovsky ©   (2008-01-08 16:01) [17]


> Zheksik ©   (08.01.08 15:45) [14]

> что по этому поводу думают профессионалы.

Мы в восхищении.

--
Regards, LVT.


 
Zheksik ©   (2008-01-08 16:02) [18]


> [17]


Кто мы???


 
Palladin ©   (2008-01-08 16:04) [19]

Это мы, проффесионалы. :)))


 
Anatoly Podgoretsky ©   (2008-01-08 16:08) [20]

> Palladin  (08.01.2008 13:57:08)  [8]

Сам ты ошибся, и в школе видимо пропустил дроби.


 
Правильный_Вася   (2008-01-08 16:08) [21]


> 0.25 <> 0.250000001

см. Правильный_Вася   (08.01.08 13:34) [5]


 
Zheksik ©   (2008-01-08 16:09) [22]

[19]
хо-хо-хо :)))

кто следующий воспользуется ситуациеё и ничем не доказав(даже наводкой, я уж не говорю про крывые наводки) скажет, что он профессионал???


 
Leonid Troyanovsky ©   (2008-01-08 16:15) [23]


> Zheksik ©   (08.01.08 16:09) [22]

> кто следующий воспользуется ситуациеё

Тебя ж оно никак не спасет.

--
Regards, LVT.


 
Dib@zol ©   (2008-01-08 16:18) [24]

Вощем это, надеюсь, поможет.

Как известно, вещественное число (для простоты возьмём тип Single) хранится в памяти так:

 1           23            8
+---+-------------------+-------+
| B |         M         |   E   |
+---+-------------------+-------+

Где B - знаковый разряд (1 бит), M - мантиса числа (23 бита), E - его порядок (8 бит).
1+23+8 = 32. => Влезет в четыре байта.
Например, возьмём число +1.25*10^5. Плюс - это ноль в знаковом разряде (если минус, то 1). 1.25 - это собсно мантисса. 5 - экспонента.

Ну тык вот. Предлагаю сравнивать отдельно мантиссы и экспоненты. Если мантиссы равны до определённого знака, то сравниваем экспоненты. Если изначально мантиссы не равны, то выходим сразу. Если равны и экспоненты, то бинго! Два числа абсолютно равны.

Как определять что больше или меньше, напишу попожже, т.к. сам пока не продумал до конца алгоритм =)


 
Германн ©   (2008-01-08 16:18) [25]


> Кстати именно из-за неуниверсальности этого метода хочу
> узнать более правильный вариант решения этой задачи.

Самый правильный - плюнуть и растереть. К тому это ещё и самый универсальный способ решения задач.


 
sniknik ©   (2008-01-08 16:19) [26]

> правильный вариант решения этой задачи.
это, то что ты озвучил, не задача, задача это то что ты делаешь, цель ради которой тебе понадобилось сравнение вещественных чисел (или чтото заменяющее).
поэтому вам и говорят постоянно - начинайте вопрос с того "что вы делаете", а не "как вы делаете". как это уже после, в пояснении, типа "делаю таким способом...", чтобы можно было решить правильный ли путь решения выбран.

> В моём случае точность определяется сотыми долями числа, поэтому остаток роли не играет...
в твоем не важно? работает? так какого тебе еще надо?

> что он профессионал???
все кто получают деньги за программирование проффесионал. по определению. ты вот тоже, если зарплату тебе за это платят.... хреновый правда, но проффессионал.


 
Zheksik ©   (2008-01-08 16:20) [27]

[23]
А кто это говорит??? ааа, тот кто мнит себя профессионалом...

Тут я с тобой полностью согласен... просто говорят, что с нкоторыми категориями граждан лучше не спорить...


 
Германн ©   (2008-01-08 16:21) [28]


> Dib@zol ©   (08.01.08 16:18) [24]
>
> Вощем это, надеюсь, поможет.
>

Не поможет.


 
Dib@zol ©   (2008-01-08 16:22) [29]

> Не поможет.

Почему??? Ах да, каюсь, про знаковый разряд забыл. Пазор на маю седую голову %)))


 
sniknik ©   (2008-01-08 16:23) [30]

> Если равны и экспоненты, то бинго! Два числа абсолютно равны.
для абсолютного равенства не надо сложностей, просто сравнение... главное сравнивать числа в однотипных переменных. (сингл-сингл)  т.к. у одинаковых чисел и погрешность будет одинаковая.


 
Zheksik ©   (2008-01-08 16:26) [31]

Dib@zol ©   (08.01.08 16:18) [24]
спасибо. видно, что профессионал...

sniknik ©   (08.01.08 16:19) [26]
Кто тебе дал право так разговаривать с людьми???

Германн ©   (08.01.08 16:18) [25]
Ваш коронный метод мне не подошёл.


 
Dib@zol ©   (2008-01-08 16:26) [32]

> т.к. у одинаковых чисел и погрешность будет одинаковая.

хм... не факт. Если например получать число 1.39857 вычислениями, а потом сравнивать его с константой, равной 1.39857, то я бы не сказал, что они окажутся абсолютно равны из-за погрешности. Поэтому и призываю сравнивать мантиссы до определённого знака. Ща кстати мож на асме алгоритмчик накидаю.


 
Zheksik ©   (2008-01-08 16:27) [33]

Германн ©   (08.01.08 16:21) [28]
Сразу было видно, что Вам не подойдёт...


 
Dib@zol ©   (2008-01-08 16:30) [34]

> [33] Zheksik ©   (08.01.08 16:27)
> Германн ©   (08.01.08 16:21) [28]
> Сразу было видно, что Вам не подойдёт...

Угомонитесь, сэр :) Просто тем, кто здесь пишет, лень что-то Вам объяснять. И я их понимаю. НГ как-никак недавно был... А я просто к олимпиаде готовлюсь =)


 
sniknik ©   (2008-01-08 16:30) [35]

> то я бы не сказал, что они окажутся абсолютно равны из-за погрешности.
значит они не "абсолютно равны", и скорее всего и твой алгоритм тоже выявит нисхождение.

кстати в статье, на которую ссылаются это есть, не буду искать но там есть типа такого пример
var s, p: single;
begin
 s:= 0.1;
 p:= 0.1;
 if s = 0.1 then ShowMessage("1 Равно!");
 if s = p then ShowMessage("2 Равно!");
end;

догадайся с двух раз что будет. ;)


 
sniknik ©   (2008-01-08 16:33) [36]

> а потом сравнивать его с константой, равной 1.39857
константа это не "однотипная" переменная, она приводится к какомуто общему(екстендед), а я говорил про однотипные.


 
Zheksik ©   (2008-01-08 16:34) [37]

Dib@zol ©   (08.01.08 16:30) [34]

> Просто тем, кто здесь пишет, лень что-то Вам объяснять.
> И я их понимаю.

так я и не прошу тех кому лень... просто раз уж есть форум, то я думал, что на нём можно задавать вопросы... Я задал вопрос, пусть и простой для кого-то, а в ответ услышал кучу оскорблений...


 
Dib@zol ©   (2008-01-08 16:34) [38]

> [36] sniknik ©   (08.01.08 16:33)

Ну тады так:

const
 _123 : Single = 1.39857;


 
Dennis I. Komarov ©   (2008-01-08 16:35) [39]

> [37] Zheksik ©   (08.01.08 16:34)

Это все потому, что "бутерброд" не правильно кушаете.


 
Zheksik ©   (2008-01-08 16:37) [40]

так я поэтому в новичках и повис с этим вопросом... ;)



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

Форум: "Начинающим";
Текущий архив: 2008.02.03;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.057 c
2-1199938728
hero
2008-01-10 07:18
2008.02.03
Помогите отсортировать ListView не по caption


2-1199875558
DevilDevil
2008-01-09 13:45
2008.02.03
Правильные Panel-и на ControlBar-е


2-1199785667
fics
2008-01-08 12:47
2008.02.03
Помогите с запросом к БД


2-1199443802
Барковъ
2008-01-04 13:50
2008.02.03
Antialiasing


2-1199617113
deadteachers
2008-01-06 13:58
2008.02.03
Ускорить процесс загрузки?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский