7 / 11 / 0
Регистрация: 01.08.2012
Сообщений: 99
|
|||||||||||
1 | |||||||||||
Засада с машинным эпсилон, или Либо я дурак07.08.2012, 18:08. Показов 8444. Ответов 18
Метки нет (Все метки)
Эту задачку выполняют все начинающие.
Так вот, берём два простеньких кода. Они настолько коротки, тупы и очевидны, что я даже не комментировал их. Первый, работает нормально.
Определить машинное эпсилон с помощью первого кода для разных типов можно, меняя одно-единственное слово в тексте, ака тип переменных (ну заломало меня извращаться, пусть будет пока так). Для float код даёт значение эпсилон 1.19e-7, для double 2.22e-16, для long double 1.08e-19. *Голосом Малышевой* Это - нормально. НО: второй код для ЛЮБОГО типа выдаёт 1.08e-19. То бишь он какого-то хрена полосатого делает преобразование типа. Вопрос: ГДЕ тут это может быть?
0
|
07.08.2012, 18:08 | |
Ответы с готовыми решениями:
18
Или я дурак, или компилятор смеется, вот только чувствую я дурак) Либо я дурак либо.... Или я дурак или лыжи не едут, склоняюсь к первому. Кроскомпиляция или в чем засада |
7 / 11 / 0
Регистрация: 01.08.2012
Сообщений: 99
|
|
07.08.2012, 20:31 [ТС] | 3 |
Походу компилятор дурак. Да, Qt подставил подножку, маладец.
Ща пойду обновлюсь. За ссылочку на ресурс, кстати, спасибо, полезная она. Тока где именно здесь загвоздка - непонятно всё равно. Блин, как только не колдую - не получается.
0
|
7 / 11 / 0
Регистрация: 01.08.2012
Сообщений: 99
|
|
08.08.2012, 10:09 [ТС] | 5 |
А в чём же тогда?
Самое странное, что код совершенно законный. Удивительное рядом.
0
|
Заблокирован
|
||||||
08.08.2012, 11:54 | 7 | |||||
kozlik_kozlik, вот твой же код только с верными(в плане превышения их макс значений) типами переменных
0
|
Модератор
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
|
|||||||||||
08.08.2012, 12:03 | 9 | ||||||||||
коды то не равнозначны в первом идет сравнение с е/4 во втором е/2 первый надо переписать так
а прокомментировал бы нашел бы ошибку
0
|
7 / 11 / 0
Регистрация: 01.08.2012
Сообщений: 99
|
|
09.08.2012, 21:46 [ТС] | 10 |
А ты вставь в цикл
cout << counter << endl; и убедись, что до переполнения тут как до Китая раком. Что такое геометрическая прогрессия, в курсе? Так вот она имеет такое замечательное свойство - очень быстро расти/падать.
0
|
7 / 11 / 0
Регистрация: 01.08.2012
Сообщений: 99
|
|||||||||||
09.08.2012, 22:20 [ТС] | 12 | ||||||||||
ValeryS, раз коды не равнозначны, то почему дают одинаковый результат (для long double исесьна)? Особенно это хорошо видно, если выводить в процессе номер и эпсилон. Не иначе как б-жье чудо. Равнозначны они. Попробуй просто в голове прокрутить, что там происходит, первые несколько шагов, буквально с калькулятором и текстовым редактором (бумажку не буду рекомендовать, уж так и быть).
Или просто взгляни на консоль, если лень. Первый код
ValeryS, на вот тебе результаты работы первого кода и второго: http://ideone.com/leMLY http://ideone.com/3zcTb Нет тут ошибки.
0
|
Модератор
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
|
|||||||||||
09.08.2012, 22:52 | 13 | ||||||||||
кручу
первый код первая проходка(дальше лень)
тогда извините а для других??? класная отмазка Добавлено через 4 минуты еще раз
0
|
7 / 11 / 0
Регистрация: 01.08.2012
Сообщений: 99
|
|
09.08.2012, 23:12 [ТС] | 14 |
ValeryS
Давай по порядку. Вот просто по-тупому. Представим, что есть такой очень хреновый тип данных, для которого 1,125 уже неотличимо от 1, а всё, что больше, отличимо. Ну так, чтобы шагов поменьше было. Первый код. Первый оборот цикла: е=0,5, а=1,25, счётчик=1, а отличается от 1, продолжаем. Второй оборот цикла: е=0,25, а=1,125, счётчик=2, а не отличается от 1, остановились. Результат: е=0,25, 2 шага. Второй код. Первый оборот цикла: сравниваем 1,5 и 1, различается, считаем дальше, е=0,5, счётчик=1. Второй оборот цикла: сравниваем 1,25 и 1, различаются, считаем дальше, е=0,25, счётчик=2. Третий оборот цикла: сравниваем 1,125 и 1, не различаются, выходим из цикла. Результат: е=0,25, 2 шага. А теперь ткни пальцем, что тут неправильно. Единственная неточность - второй код делает три шага, а у меня выводится два. Похрен, мне надо было оценить порядок величины, проблема вообще не в этом. Люди, вы чего? Уже второй чудесатый "ответ" в теме. Да с каким гонором-то. Жара что ли так действует?
0
|
7 / 11 / 0
Регистрация: 01.08.2012
Сообщений: 99
|
|
09.08.2012, 23:46 [ТС] | 16 |
ValeryS, мир.
Так чё с типами-то? Диавольщина какая-то
0
|
Заблокирован
|
||||||
10.08.2012, 04:15 | 17 | |||||
g++ 4.6.3 три версии первого кода (float, double, long double) и три такие же версии второго. Может просто перекомпилировать файлик забыл и запускаешь один и тот же бинарь?
0
|
7 / 11 / 0
Регистрация: 01.08.2012
Сообщений: 99
|
|
10.08.2012, 18:16 [ТС] | 18 |
alkagolik, стопудов нет.
Добавлено через 46 минут С float помогло while ((float)(e/2.0+a)>a). Ви таки будете смеяться, но с double такое почему-то не прокатывает%) Результат по-прежнему как для long double.
0
|
Заблокирован
|
|
10.08.2012, 20:34 | 19 |
Не по теме: kozlik_kozlik, ну тогда в bug reports Добавлено через 11 минут kozlik_kozlik, есть имхо. в первом примере сравниваются две переменные встроенных типов, а во втором примере результат арифметической операции (скорее всего уложенный в long double) с переменной, которая автоматически приводится к большему типу.
0
|
10.08.2012, 20:34 | |
10.08.2012, 20:34 | |
Помогаю со студенческими работами здесь
19
Баг компилятора или я дурак? Что-то интересное. Или программа, которая принимает либо 1, либо 2 числа Либо я дурак либо лыжи не едут Баг или я дурак =) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |