![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
xTr1m |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 692 Регистрация: 9.2.2005 Где: Москва Репутация: 1 Всего: 1 |
Доброго времени суток. Решил отправить тестовое задание в яндекс, для собственной проверки. Задания вроде были не очень сложные, но получил отказ. Если можно, то хотел бы отдать кому-нибудь код "на проверку", чтобы сказали, что не так. Сюда, наверное, выкладывать не буду, могу отослать на почту или в личку. Заранее спасибо.
|
|||
|
||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 7 Всего: 50 |
Чего? выкладывай
|
|||
|
||||
xTr1m |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 692 Регистрация: 9.2.2005 Где: Москва Репутация: 1 Всего: 1 |
||||
|
||||
Guinness |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: нет Всего: 10 |
Второе задание, я думаю они хотели примерно этого. Или если QString как контейнер не катит, то запихивать в массив char.
|
|||
|
||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 7 Всего: 50 |
xTr1m, это, что все задания, не верю
|
|||
|
||||
xTr1m |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 692 Регистрация: 9.2.2005 Где: Москва Репутация: 1 Всего: 1 |
там был еще один вопрос про скорость алгоритмов и на многопоточность. можно глянуть тут
это, как я понимаю, первый уровень отсева |
|||
|
||||
bsa |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
xTr1m, и не удивительно, что тебя послали. Кому нужен оторванный от жизни школьник?
Функция main() должна возвращать int. хидер "conio.h" нестандартен. Тебя просили целое число преобразовать в строку, а ты что сделал? Имхо, я бы это задание выполнил так:
А в примере на многопоточность есть как минимум две проблемы: когда Add лочит doubles, а Find(int) к этому времени уже залочил integers, затем Find может попытаться захватить doubles, но не выходит и ждет другой поток, а другой поток ждет освобождения integers - deadlock. Вообще ситуация с захватом двух мьютексов очень сложная и требует очень большой аккуратности и максимального ограничения областей захвата. В данном случае, лучше лочить не одновременно, а по очереди (что в find, что в add). Вторая проблема связана с сравнением чисел с плавающей точкой. Очень часто операция сравнения (operator==) может банально не работать. Поэтому для действительных чисел лучше использовать неточное сравнение ( abs(a - b) < eps ). |
||||
|
|||||
volatile |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
Ну вот кто это составляет такие заданя. Тут надо по крайней мере написать что они вообще хотели. Если исходить из того, что дано, тогдаа члены i вообще нужно удалить. Доступа к ним нет, а сам класс с ними ничего не делает. А фантазировать, на тему, что с ними хотел делать автор, это из области парапсихологии. Так что вот так будет правильней:
По крайней мере здесь все правильно, и интерфейс для пользователя, не изменицца. (т.е. там где работал исходный код, там-же точно с таким эффектом будет работать и этот. Только без путаницы и оверхедов. Это сообщение отредактировал(а) volatile - 29.3.2013, 23:39 |
||||
|
|||||
noize |
|
|||
![]() 5.18.2 ![]() Профиль Группа: Участник Сообщений: 89 Регистрация: 10.7.2010 Где: СПб Репутация: нет Всего: 3 |
не раскажете подробнее о данной проблеме? |
|||
|
||||
Crafty |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 319 Регистрация: 3.11.2008 Репутация: 2 Всего: 14 |
Проблема в том, что числа с плавающей точкой нельзя представить точно.
Добавлено @ 13:34 Поэтому обычно сравнивают вот так
Это сообщение отредактировал(а) Crafty - 1.4.2013, 15:11 |
||||||
|
|||||||
Guinness |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: нет Всего: 10 |
Хм, я обычно сравниваю так:
|
|||
|
||||
noize |
|
|||
![]() 5.18.2 ![]() Профиль Группа: Участник Сообщений: 89 Регистрация: 10.7.2010 Где: СПб Репутация: нет Всего: 3 |
Crafty,
1. это справедливо и для float ? 2. В языке C действует такое же ограничение? Это сообщение отредактировал(а) noize - 1.4.2013, 14:03 |
|||
|
||||
Crafty |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 319 Регистрация: 3.11.2008 Репутация: 2 Всего: 14 |
Зачем так много действий в условии и max и умножение Попробуйте сравнить допустим 1.0 и 1.1 при эпислон 0.0001, в твоем случае он считает что они равны, что не верно Добавлено @ 14:06 noize, на всех языках ИМХО одно и тоже что паскаль, что си, что питон. Тут дело не в языке программирования ,а в том как представлены числа с плавающей точкой на самой машине. Добавлено @ 14:06 да Это сообщение отредактировал(а) Crafty - 1.4.2013, 14:10 |
|||
|
||||
Guinness |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: нет Всего: 10 |
Разве? (1.1 - 1.0 = 0.1) < 1.1 * 0.00001 Вроде как неравенство не проходит в данном случае, и числа неравны. Собственно, делается это, для того чтобы сравнивать числа любых размеров. К примеру: a = 0.008 b = 0.00701 eps = 0.001 abs(a-b) < max(a,b) * eps => 0.00099 < 0.008*0.001 Соотвественно, данные цифры не равны, что вполне логично. Т.к. различия у них в первой же значащей цифре. И другой пример a = 1.008 b = 1.00701 eps = 0.001 abs(a-b) < max(a,b) * eps => 0.00099 < 1.008*0.001 А тут цисла равны. Что, как мне кажется, правильно. В Вашем же случае, нужно постоянно менять эпсилон, чтобы понимать в каком знаке Вы хотите совпадения. Это сообщение отредактировал(а) Guinness - 1.4.2013, 14:37 |
|||
|
||||
noize |
|
||||
![]() 5.18.2 ![]() Профиль Группа: Участник Сообщений: 89 Регистрация: 10.7.2010 Где: СПб Репутация: нет Всего: 3 |
Crafty, а как же утверждение о том, что стандарт языка гарантирует 6 цифр после мантиссы для float и n-ое количество цифр для double?
Вот такая программка
выдаёт вот такой результат:
|
||||
|
|||||
Crafty |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 319 Регистрация: 3.11.2008 Репутация: 2 Всего: 14 |
http://liveworkspace.org Добавлено через 4 минуты и 27 секунд
Эпсилон это всего лишь точность с которой ты хочешь сравнивать числа, и не надо ничего менять. |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
в ещё бОльшей степени, чем для double. Дело в том, что числа с плавающей точкой хранятся в компьютере след.образом: ![]() где fraction - это доля числа от 0 до 1 ( 52 нуля - это 0, 52 единицы - это 1, единица и 51 нуль - это примерно 0,5). Минимальное расстояние между двумя числами 2^-52. Представь себе шкалу, с делениями 0, 2^-52, 2*2^-52, 3*2^-52 и т.д. Если число, записанное в привычной тебе (и мне)) десятичной системе (например 0,1), попытаться положить на эту шкалу, то оно ляжет между двумя делениями (за исключением случаев точного попадания). При разборе такого кода:
компилятор "кладёт" это число на шкалу, затем берёт ближайшее значение из шкалы и записывает его в x. Т.о. в x помещается не 0,1, а ближайшее к нему (0.1000000000000000055511151). Фух... я выдохся )) Добавлено через 2 минуты и 50 секунд Вот - почитай Это сообщение отредактировал(а) borisbn - 1.4.2013, 14:50 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
Guinness |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: нет Всего: 10 |
Пардон, нужно fabs использовать. http://liveworkspace.org/code/2JEbmD$8 По поводу, не надо ничего менять. Я не согласен. Потому что, если вы ещё раз посмотрите пример, который я привел, то поймете, что в случае с Вашим использщованием эпсилон, сравнение некорректно. |
|||
|
||||
Crafty |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 319 Регистрация: 3.11.2008 Репутация: 2 Всего: 14 |
Почему некорректно, сама идея в эпсилоне в том, что мы точно знаем какую точность нам надо учитывать, допустим эпсилон равен 0.0001 то мы уверены, что разница в числе не должна быть больше чем 0.0001 иначе они не равны. Эпсилон всегда можно сделать достаточно маленьким. |
|||
|
||||
Guinness |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: нет Всего: 10 |
О том и речь. Что эпсилон Вам нужно будет менять в зависимости от размера сравниваемых чисел. Иначе получится такая петрушка:
Хотя, я понял Вашу мысль. Но я бы считал сравнение в приведенном выше примере - некорректным. Это сообщение отредактировал(а) Guinness - 1.4.2013, 15:23 |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
ну... как бэ... да. а что смущает ? -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
Guinness |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: нет Всего: 10 |
В зависимости от того, что Вы хотите получить. Мне при сравнении чисел важно определенное количество знаков после первой значащей цифры, а не после запятой. И вариант, когда 0,002 = 0,0011, и при этом a = 1,00000001*10^10 и b=1.0*10^10, которые намного ближе друг к другу по значению - неравны, я считаю неприемлимым. Собственно, главная проблема в том, что при сравнении нужно знать размер чисел, которые мы сравниваем. Это сообщение отредактировал(а) Guinness - 1.4.2013, 15:57 |
|||
|
||||
fish9370 |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: -1 Всего: 1 |
постараюсь расшифровать, то что пытаются тебе тут донести если ты возьмешь и сделаешь так:
естественно, эти два числа будут равны, это у тебя по условию (ты сам туда записал два одинаковых числа) если числа будут получены в результате некоторого моделирования, то числа могут быть не равны на машинном уровне, но для данного моделирования их разница может считаться не существенной, в этом случае требуется округление.. вот тогда и прибегают к этому приему (это стандартный прием у математиков, есть целый раздел связанный с погрешностью) PS. спор возникший, следует закрывать, вы оба правы, только вы вычисляете разные вещи.. Это сообщение отредактировал(а) fish9370 - 1.4.2013, 17:08 -------------------- undefined |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |