Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Прокомментируйте код, пожалуйста |
Автор: xTr1m 29.3.2013, 11:58 |
Доброго времени суток. Решил отправить тестовое задание в яндекс, для собственной проверки. Задания вроде были не очень сложные, но получил отказ. Если можно, то хотел бы отдать кому-нибудь код "на проверку", чтобы сказали, что не так. Сюда, наверное, выкладывать не буду, могу отослать на почту или в личку. Заранее спасибо. |
Автор: Alca 29.3.2013, 13:23 |
Чего? выкладывай |
Автор: xTr1m 29.3.2013, 13:37 |
Ладно, прикреплю как файл |
Автор: Guinness 29.3.2013, 14:12 | ||
Второе задание, я думаю они хотели примерно этого. Или если QString как контейнер не катит, то запихивать в массив char.
|
Автор: Alca 29.3.2013, 14:35 |
xTr1m, это, что все задания, не верю |
Автор: xTr1m 29.3.2013, 14:38 |
там был еще один вопрос про скорость алгоритмов и на многопоточность. можно глянуть http://company.yandex.ru/job/vacancies/dev_browser.xml это, как я понимаю, первый уровень отсева |
Автор: volatile 29.3.2013, 23:24 | ||||
Ну вот кто это составляет такие заданя. Тут надо по крайней мере написать что они вообще хотели. Если исходить из того, что дано, тогдаа члены i вообще нужно удалить. Доступа к ним нет, а сам класс с ними ничего не делает. А фантазировать, на тему, что с ними хотел делать автор, это из области парапсихологии. Так что вот так будет правильней:
По крайней мере здесь все правильно, и интерфейс для пользователя, не изменицца. (т.е. там где работал исходный код, там-же точно с таким эффектом будет работать и этот. Только без путаницы и оверхедов. |
Автор: noize 1.4.2013, 08:51 | ||
не раскажете подробнее о данной проблеме? |
Автор: Crafty 1.4.2013, 13:31 | ||||||
Проблема в том, что числа с плавающей точкой нельзя представить точно.
Добавлено @ 13:34 Поэтому обычно сравнивают вот так
|
Автор: Guinness 1.4.2013, 13:44 | ||
Хм, я обычно сравниваю так:
|
Автор: noize 1.4.2013, 14:02 |
Crafty, 1. это справедливо и для float ? 2. В языке C действует такое же ограничение? |
Автор: Crafty 1.4.2013, 14:05 |
Зачем так много действий в условии и max и умножение Попробуйте сравнить допустим 1.0 и 1.1 при эпислон 0.0001, в твоем случае он считает что они равны, что не верно Добавлено @ 14:06 noize, на всех языках ИМХО одно и тоже что паскаль, что си, что питон. Тут дело не в языке программирования ,а в том как представлены числа с плавающей точкой на самой машине. Добавлено @ 14:06 да |
Автор: Guinness 1.4.2013, 14:37 | ||
Разве? (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 А тут цисла равны. Что, как мне кажется, правильно. В Вашем же случае, нужно постоянно менять эпсилон, чтобы понимать в каком знаке Вы хотите совпадения. |
Автор: noize 1.4.2013, 14:40 | ||||
Crafty, а как же утверждение о том, что стандарт языка гарантирует 6 цифр после мантиссы для float и n-ое количество цифр для double? Вот такая программка
выдаёт вот такой результат:
|
Автор: Crafty 1.4.2013, 14:41 | ||
http://liveworkspace.org/code/2JEbmD$6 Добавлено через 4 минуты и 27 секунд
Эпсилон это всего лишь точность с которой ты хочешь сравнивать числа, и не надо ничего менять. |
Автор: borisbn 1.4.2013, 14:48 | ||
в ещё бОльшей степени, чем для 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 секунд Вот - http://ru.wikipedia.org/wiki/%D0%A7%D0%B8%D1%81%D0%BB%D0%BE_%D0%B4%D0%B2%D0%BE%D0%B9%D0%BD%D0%BE%D0%B9_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D1%81%D1%82%D0%B8 |
Автор: Guinness 1.4.2013, 14:53 | ||
Пардон, нужно fabs использовать. http://liveworkspace.org/code/2JEbmD$8 По поводу, не надо ничего менять. Я не согласен. Потому что, если вы ещё раз посмотрите пример, который я привел, то поймете, что в случае с Вашим использщованием эпсилон, сравнение некорректно. |
Автор: Crafty 1.4.2013, 15:11 | ||
Почему некорректно, сама идея в эпсилоне в том, что мы точно знаем какую точность нам надо учитывать, допустим эпсилон равен 0.0001 то мы уверены, что разница в числе не должна быть больше чем 0.0001 иначе они не равны. Эпсилон всегда можно сделать достаточно маленьким. |
Автор: Guinness 1.4.2013, 15:16 | ||||
О том и речь. Что эпсилон Вам нужно будет менять в зависимости от размера сравниваемых чисел. Иначе получится такая петрушка:
Хотя, я понял Вашу мысль. Но я бы считал сравнение в приведенном выше примере - некорректным. |
Автор: borisbn 1.4.2013, 15:49 | ||
ну... как бэ... да. а что смущает ? |
Автор: Guinness 1.4.2013, 15:54 |
В зависимости от того, что Вы хотите получить. Мне при сравнении чисел важно определенное количество знаков после первой значащей цифры, а не после запятой. И вариант, когда 0,002 = 0,0011, и при этом a = 1,00000001*10^10 и b=1.0*10^10, которые намного ближе друг к другу по значению - неравны, я считаю неприемлимым. Собственно, главная проблема в том, что при сравнении нужно знать размер чисел, которые мы сравниваем. |
Автор: fish9370 1.4.2013, 16:52 | ||||
постараюсь расшифровать, то что пытаются тебе тут донести если ты возьмешь и сделаешь так:
естественно, эти два числа будут равны, это у тебя по условию (ты сам туда записал два одинаковых числа) если числа будут получены в результате некоторого моделирования, то числа могут быть не равны на машинном уровне, но для данного моделирования их разница может считаться не существенной, в этом случае требуется округление.. вот тогда и прибегают к этому приему (это стандартный прием у математиков, есть целый раздел связанный с погрешностью) PS. спор возникший, следует закрывать, вы оба правы, только вы вычисляете разные вещи.. |