Показаны сообщения с ярлыком lesson 4. Показать все сообщения
Показаны сообщения с ярлыком lesson 4. Показать все сообщения

пятница, 24 октября 2014 г.

Урок 4. Слайд 208-209

Поехали:

Слайд 208


Содержимое слайда:
В этой лекции мы рассмотрели:
- как компьютеры хранят некоторые типы данных
- двоичную арифметику и ошибки, связанные с арифметикой с плавающей точкой
- структуры управления программой
оценка полноты тестирования

Слайд 209
Конец урока 4.

среда, 22 октября 2014 г.

Урок 4. Слайд 207

Поехали:

Слайд 207
Brian Marick один из самых первых авторов инструмента измерения покрытия кода. Он написал широко известный монитор для программ, написанных на C и был нанят как консультант по написанию ядер для многих коммерческих инструментов измерения покрытия кода. Также он консультировал компании, использующие эти инструменты. Он писал о проблемах своей работы в статье How to Misuse Code Coverage.
Когда вы измеряете чью-либо производительность, эти люди, обычно, делают что-нибудь, чтоб выглядеть лучше. Если вы считаете, как много моих операторов тестируется, я добавлю тесты, чтоб проверять больше операторов, но это не значит, что я добавлю хорошие тесты. Покрытие не измерит качество моих тестов, не измерит то, как он спроектированы, как находят баги. Оно лишь проверит, как много операторов затронуто.
Brian увидел, что многие компании заставляли своих программистов поддерживать 100% покрытие, но их тесты не обязательно были качественными. Люди перемещали фокус с написания хороших тестов на написание тестов, дающих хорошее покрытие. Они покрывали больше строк кода, но находили меньше багов.
Измерение покрытия - плохой способ узнать, как близки вы к достижению цели. Достижение 90% покрытия ветвей не скажет вам, насколько тщательно вы провели тестирование. однако это не делает измерение покрытия ветвей бесполезным. Это лишь говорит о том, что это плохой инструмент для определения полноты тестирования.
Другой путь использования этого инструмента - узнать, какие области вашей программы не тестируются или тестируются плохо.
Тестируя снаружи, можно пропустить многие вещи. Много отчетов по покрытию говорили, что план тестирования проекта покрывает всего 35% кода. Когда вы определите, что стоит за остальными 65%, вы сможете спроектировать тесты так, что они покроют и эти пропущенные участки.

вторник, 21 октября 2014 г.

Урок 4. Слайд 205-206

Поехали:

Слайд 205
Покрытие ветвей удобно в использовании. Ничего из того, что я говорил вам сегодня, не должно заставить думать вас, что покрытие ветвей не стоит использовать.
Программисты, достаточно дисциплинированные, чтоб достичь 100% покрытия ветвей кода, пропускают гораздо меньше багов, чем те, кто этого не делают.
Когда я веду курсы программирования, я настоятельно рекомендую моим студентам изучить и использовать монитор покрытия кода и стремиться достигать 100% покрытия ветвей. на продвинутом курсе, те, кто этого не делает, получают ноль за задания.
Такие инструменты обычно свободно распространяются или достаточно дешевы, просты в использовании и помогают находить баги. Когда вы пишете код, вы должны их использовать.
Некоторые люди пытаются поощрять тестировщиков, тестирующих методом черного ящика, к использованию подобных инструментов, когда они занимаются своим тестированием. Но в качестве black box tester я никогда не находил подобные инструменты полезными.

Слайд 206
Год назад я управлял разработкой нового релиза десктопной программы. VP разработки поинтересовались, какого покрытия коды достигает наше тестирование. Я не знал. Они спросили снова спустя несколько дней и я сказал, что перед тем, как мы этим займемся, ы должны проверить совместимость нашей программы с 80 принтерами. Сейчас же мы работаем с 10. И я беспокоюсь об этом.
После этого VP прекратили задавать мне вопросы о том, сколько линий кода мы протестировали и начали спрашивать с каким количеством моделей принтеров мы работаем. процент принтеров - лучшая оценка, нежели процент покрытия кода.
Другая важная метрика, которая влияла на тот проект - это большой список текстовых и графических программ с которыми мы должны были работать. Это значит, что мы должны были проверить их все.
Также у многих программистов нашей платформы были проблемы с чтением или записью файлов размером от 2 до N байт. Поэтому мы хотели протестировать каждый тип файла и для всех размерах файлов, о которых мы беспокоились.

Это примеры покрытия:
- совместимость с устройствами
- формат входных файлов
- формат и размер выходных файлов

Эти вещи были покрыты тестами, так как мы выяснили так как мы выяснили, как много тестов нам нужно прогонять и знали, какой процент из них был уже проверен.

 Вы могли бы представить, как много тестов вы смогли бы придумать и прогнать, затем рассмотреть процент из них, которого будет достаточно, их отношение будет настоящим покрытием.

К сожалению, общее число тестов всегда бесконечно, так что настоящее покрытие всегда равно нулю.

пятница, 17 октября 2014 г.

Урок 4. Слайд 203-204

Вчера первый раз прокатился по снегу:
Занятно, но ботинки все же летние, поэтому сегодня поставил педали топталки - и впервые за несколько месяцев прокатил на них. Ужасно, слишком привык к хорошему. Как вообще раньше на них катал, хех.

Поехали:

Слайд 203
Структурное покрытие легко измерять, но оно неполное.
Вот простой пример программы, иллюстрирующий проблему. Программа запрашивает два инпута: A и B и печатает их отношение. Можно достичь покрытия ветвей программы за 1 тест.
Но можно ввести значение B=0. Что тогда случится? Структурное тестирование слепо к переменным, которые не проверяются программой. Нет кода, учитывающего B=0. И мы не увеличим этот вид покрытия, добавив такой тест.

Слайд 204
Обработкой ошибок занимается серьезный процент кода. Обработка деления на ноль- лишь простой пример.
Тесты, спроектированные для максимизации структурного покрытия, слепы в плане обнарушения и обработки ошибок.
Они не заметят, если программа при вычислениях использует всю доступную память и упадет из за этого. Они не заметят, если входящее в программу сообщение слишком большое и переполнит временное хранилище для обработки таких сообщений. Переполнение буфера - одна из самых распространенных уязвимостей в web приложениях.
Тесты, спроектированные для максимизации структурного покрытия также слепы по отношению ко многим другим рискам. Они не проверяют скорость работы программы, сложность ее понимания, способность приносить заявленную пользу или совместимость с широко используемыми видеокартами.

четверг, 16 октября 2014 г.

Урок 4. Слайд 201-202

Снежок...


Поехали:


Слайд 201
Вы достигните покрытия ветвей, если пройдете все операторы и все ветви.
Подавляющее большинство программистов и консультантов считают, что мы получаем 100% покрытия кода, если имеем 100% покрытия ветвей. Это глупо.
Со структурной точки зрения, вопиющая ошибка этого утверждения в том, что оно не учитывает прерывания. Операционная система может переключать контроль с программы на обработчик прерывания в любой момент выполнения программы и настолько, насколько нужно. Состояние системы за это время может изменится способом, который критичен для вас. Другое ПО может изменить данные на диске, в памяти, занять ресурсы, замедлить обработку ваших данных или могут случиться другие подобные вещи до того, как вы будете готовы работать с ними. Все это может вызвать сбои. Также все это может вызвать сбои в системе, на которой работает программа.
Я рассматриваю прерывания как ветви. Можно рационализировать их игнорирование, так как тестировать прерывания достаточно проблематично. Их нельзя увидеть в коде. Кроме того, обычно программисты не учитывают их в коде. Таким образом нельзя сказать, что мы учитываем эти ветви, когда говорим о покрытии кода.
И было бы неправильным говорить о полном покрытии кода, когда есть масса путей вызвать сбой.


Слайд 202
Продолжаем говорить о структурном покрытии (и игнорируем прерывания). Следующий уровень - многопараметрическое покрытие. Мы проверяем все комбинации логических переменных. Мы не просто проверяем обе ветви в двух условиях. Мы проверяем комбинации да-да, нет-нет, да-нет, нет-да, то есть нам  нужны 4 теста.
Есть способы оптимизации для уменьшения количества тестов при достижении этого варианта покрытия. Но, тем не менее, нам все равно понадобится больше тестов, чем при покрытии ветвей.

среда, 15 октября 2014 г.

Урок 4. Слайд 198-200

Поехали:

Слайд 198
Когда программисты и профессора компьютерных наук говорят о покрытии, они обычно имеют в виду структурное покрытие.
Amman и Offutt вели интересную дискуссию о покрытии графов. 
Paul Jorgenson написал хорошее введение в покрытие потока данных.

Содержимое слайда:
Структурное покрытие оперирует управляющими структурами программы. Примеры:
Покрытие операторов: выполнение каждого оператора программы
Покрытие ветвей: каждый оператор и каждая ветвь
Multi-condition: покрытие всех комбинаций логических переменных.

Слайд 199
Но во всех обсуждениях, включая обсуждения стандартов, обычно говорится о простом описании структуры управления программы.

Содержимое слайда:
IEEE 982.1-1988 4.17

Слайд 200
Вы добъетесь 100% покрытия операторов программы, если каждый оператор будет выполнен,
Можно достичь 100% покрытия простой программы за 1 тест.

вторник, 14 октября 2014 г.

Урок 4. Слайд 196-197

Поехали:

Слайд 196
Прерывание это сигнал о том, что какой-то вид события произошел. Есть хардварные и софтварные прерывания. В любом случае, компьютер хранит определенный набор ключевых данных в некоем временном хранилище. Затем компьютер запускает обработчик прерывания, определяет, как реагировать на событие, которое произошло, работает с ним, возвращается к работе с основной программой, перезагружает временные данные.
Для основной программы как бы ничего не произошло. Но это фоновое событие, обработанное через прерывание, может быть критичным для программы. Например, принтер может уйти в оффлайн, пока программа работает с ним. Или данные, с которыми работает программа, изменились.

Содержимое слайда:
Хардварное прерывание заставляет процессор сохранять состояние программы и начать обработку прерывания. Оно может произойти в любое время, пока программа находится в любом состоянии. 
Софтварное прерывание обычно реализуется в виде инструкции, которая переключает контекст на обработчик прерывания, подобно хардварному прерыванию. Оно происходит в момент, который определил программист. 

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

Примеры:
  • нажатие клавиш
  • ошибки ввода вывода
  • сигналы времени

Ошибки:
  • гонка состояний (задержка выполнения программы, связанная с недостатком ресурсов)
  • переполнение стека
  • смертельное объятие (событие А не может произойти, пока не закончится событие В, событие В не может закончится, пока не произойдет событие А)
Слайд 197
Теперь, когда мы рассмотрели хранение и управление данными, можно обратиться к покрытию. Вопрос покрытия - сколько вы протестировали? Обычно ответ выглядит как процент или пропорция. Я проверил половину кода или все принтеры.

пятница, 10 октября 2014 г.

Урок 4. Слайд 193-195

Поехали:

Слайд 193
Петля это повторяющаяся последовательность.

Содержимое слайда
Программа повторяет набор инструкций, пока не выполнится критерий выхода

Ошибки:
- бесконечная петля
- петля выполняется за единицу времени слишком много или слишком мало раз
- переполнение памяти
- слишком большие объекты порожденные петлей, так как она выполнилась слишком много раз
- слишком медленная, так как код не оптимизирован для большого количества выполнений

Слайд 194
Функция - это самостоятельная, отделимая задача. Например, мы передаем число в функцию корня, она возвращает корень этого числа.
Программисты широко используют функции. библиотеки функций часто поддерживаются и создаются отдельными людьми, и, как правило, тщательно тестируются. Библиотеки могут поставляться с языком программирования или их можно купить.

Содержимое слайда:
Функции
- могут быть вызваны из другой части программы
- содержат действие и/или возвращают значение

Ошибки:
- утечка памяти
- неожиданное изменение глобальных переменных (или данных на диске)
- падение без уведомление вызывающего или игнорирование вызывающим кода падения функции

Слайд 195
Исключения это вытащи-меня-отсюда команды.например, если вы пытаетесь записать что-то на диск, а диск сломан, то драйвер, работающий с диском выбрасывает исключение и прекращает пытаться писать данные на диск.
Самые распространенные исключения, которые вам известны, это деление на ноль, переполнение памяти, ошибка записи в защищенную часть памяти, прекращение выполнения программы средствами операционной системы.
Если в программе происходит исключение и программа не может перехватить его, то операционная система может прекратить работу программы и самостоятельно обработать исключение.
Исключение может оставить программу в беспорядочном состоянии. Когда исключение выбрасывается и передает управление в другой метод, то этот метод не имеет информации, в каком состоянии находится программа, память, операционная система. Умелая работа с исключениями - сложная, но необходимая вещь для воспроизведения ошибок.

Содержимое слайда:
Ошибки:
Исключения часто оставляют за собой переменные или сохраняют информацию в промежуточном состоянии, с которым программа не сможет работать.

четверг, 9 октября 2014 г.

Урок 4. Слайд 190-192

Происходит такая хуйня столько интересного, что тянет процитировать пана Анджея:
В лето Господне 1420 конец света не наступил. Хоть многое говорило о том, что наступит.
Но все равно было весело.
Знаете, господа, как узнать, что время идет историческое? Просто всего происходит очень много и быстро.
Порой было так страшно, что, с вашего позволения, аж жопа съеживалась.

Поехали:

Слайд 190
До сих пор мы изучали данные, в основном, как компьютер хранит и ищет данные. Время переместить фокус на управление. Структуры управления сообщают компьютеру что делать дальше.

Содержимое слайда:
Структуры управления
- последовательность
- ветвь
- петля
- вызов метода
- исключение
- прерывание

Слайд 191
Простейшая структура это последовательность. Просто выполнять следующую команду.

Содержимое слайда:
программа включает в себя список операторов
если вы начали выполнять последовательность, то закончите ее

Слайд 192
Ветвь - это точка принятия решения. Компьютер оценивает логическое выражение, наподобие X равен Y.
Если выражение равно true, программа делает что-то одно, если false, то что-то другое.

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

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

среда, 8 октября 2014 г.

Урок 4. Слайд 187-189

Доброго утра:


Поехали:

Слайд 187
Следующая структура данных - запись, учетная запись (record).

Содержимое слайда
Данные связаны, поэтому хранятся вместе
- имя
- фамилия
- адрес
- город
- штат
- страна
- почтовый код
- идентификационный номер
Одна запись - один человек
Каждая часть - поле

Операции:
- поиск запили по полю среди других
- получение значения поля
- изменение значения поля
- сортировка записей

Ошибки:
- запись некорректных данных или запись в неверное поле
- хранение некоректных данных
- переполнение или неполные данные (underflow)

Слайд 188
Массив - последовательность определенных типов данных. В массиве A состоящем из integer, вы можете запросить A[0] и получите первый элемент из массива A. Можно создать массив из записей.

Содержимое слайда:
Линейная последовательность переменных определенного типа.
Операции: чтение, запись, сортировка,
Ошибки:
- чтение или запись после завершения массива
- чтение неинициализированных данных
- чтение/ запись неправильного элемента

Слайд 189
Списки похожи на массивы, но более общие.
Например, у нас может быть список списков и каждый из этих списков будет содержать различный набор записей. Один список может содержать цены, другой список займов.
Когда мы храним какой-либо набор данных мы хотим иметь возможность позднее найти его. Каждая структура данных делает определенный вид поиска более простым. Структура, удобная для работы определенным образом для определенных задач может быть неудобной в других случаях.
Особенно в программах реального времени, таких как игры, когда программисты работают с большими объемами памяти, большая часть работы состоит в оптимизации структур данных для достижения компромисса между скоростью самых важных операций и объемом используемой памяти.

Содержимое слайда.
Список.
Схож с массивом в:
- Набор переменных определенного типа.
- Мы можем читать и писать в отдельные переменные
Разница:
- каждая переменная может быть любого размера. например список списков разного размера.
- поиск идет не обязательно по номеру. Элементы упорядочены и поиск пожет проходить по полям или набору полей.
- для получения элемента нужно двигаться по списку, пока на найдете его.

Ошибки:
- Поиск вперед по списку, когда нужный элемент находится позади текущей позиции
- Чтение или запись за границами списка.
- некорректное определение текущего положения указателя относительно элемента

вторник, 7 октября 2014 г.

Урок 4. Слайд 185-186

Установил намедни приложение я.транспорт - в рамках поддержки коллег.
И тут же вижу, как мой дом был переехан трамваем первого маршрута:
В режиме реального времени. Потом трамвай еще покрутился по площади и поехал по рельсам.
Есть над чем работать.

Поехали:

Слайд 185
наряду с хранением отдельных чисел и символов мы имеем возможность хранить структуры данных. Мы воспринимаем структуру данных как набор чисел и символов, специальным образом организованных.
Моя цель - просто упомянуть об этом, чтоб вам было известно. Большинство данных в программах хранится именно в структурах данных. Чтоб узнать больше о них, пройдите курс структуры данных. Это один из самых первых курсов в учебном плане компьютерных наук. На этом курсе вы узнаете, чем одни структуры отличаются от других, какие в каких случаях лучше использовать, какие баги с ними случаются и какие риски они несут.
В будущем я часто буду упоминать ошибки, связанные со специфическими структурами данных. Это не обязательно самые распространенные или самые важные ошибки. Это ошибки, которые пришли мне в голову первыми, чтоб лучше объяснить вам то, как связаны структуры данных, используемые нами и тестирование.

Слайд 186
Простейшая структура - строка. Последовательность символов.

Содержимое слайда:

Строка.

Операции:
- поиск по подстроке
- замена подстроки
- объединение с другой строкой
- вычисление длинны
- усечение (truncate)

Типовые ошибки:
- переполнение
- совпадение или несовпадение

понедельник, 6 октября 2014 г.

Урок 4. Слайд 183-184

Накраудфандили офисной комнатой бинокль x30:
Отличная штука, из тех, что не нужны, но очень хочется.

Поехали:

Слайд 183
Мы можем хранить в памяти символы, но не числа. Мы их декодируем. Наиболее широко распространенная схема кодирования ASCII - американский стандартный код для обмена информацией. ASCIIкодирует буквы, цифры и другие символы типа пробелов. например код двойки - 50.
ASCII изобретена для телетайпа, поэтому хранит все в 8 битах.
Другой стандарт кодирования называется Юникод. Он хранит данные в 16 битах и работает с многими языками.

Слайд 184
Давайте просуммируем. Когда программа читает 32-битное слово из памяти, она их так или иначе интерпретирует. Как integer, число с плавающей точкой, последовательность символов или что-то еще. По самим 32 битам данных нет возможности сказать. какой тип данных передается.
У программа может воспринимать данные корректно - или может ошибочно считать слово числом или наоборот.

пятница, 19 сентября 2014 г.

Урок 4. Слайд 180-182

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




Поехали:

Слайд 180
Арифметика с плавающей точкой в двоичной системе по существу то же самое, что в десятичной. в 32-битных словах первый бит - знак мантиссы. Следующие 8 бит - знак и значение экспоненты. Остальные 23 - мантисса. Это примерно соответствует 10 знакам десятичного числа.

Слайд 181
Также мы можем удвоить точность, используя 64 разряда, в этом случае у нас будет 52 бита мантиссы.

Слайд 182
Вместе с десятичной и двоичной системой мы часто говорим о шестнадцатеричной. В этом случае наш диапазон значений цифры - от 0 до 15.

четверг, 18 сентября 2014 г.

Урок 4. Слайд 177-179

Поехали:

Слайд 177
 Разрядность integer чаще определяется языком программирования, нежели компьютерным чипом. Это дает нам возможность проводить вычисления с помощью одной программы с одинаковой точностью на разных типах компьютеров. Для некоторых особых компьютеров integer может занимать больше или меньше одного компьютерного слова (разрядности компьютера).

Слайд 178
Так как integer имеет разный размер в разных языках программирования, мы часто рассматриваем minInt и maxInt - минимальное и максимальное значения integer на этой языке и на этой системе.

Слайд 179
Java поддерживает 4 типа integer, от 8 до 64 бит. Я видел integer с 12,24, 48 и 128 битами. Когда проектируете тесты, сосредоточтесь на работе с ограничениями minInt и maxInt, вместо того, чтоб думать о разрядностях. Опишите в тесте эти ограничения. Создайте специальные константы для этих чисел, но понимайте, что чем чаще вы их используете в коде, документации и тестах, тем больше вероятность, что они устареют, тем сложнее будет использовать эти проверки на другой системе или на другом языке или в случае ерфакторинга программы с использованием integer другой разрядности.

среда, 17 сентября 2014 г.

Урок 4. Слайд 174-176

Поехали:

Слайд 175
Самое большое число, которое вы можете хранить, используя 8 бит, это 255. Добавьте что угодно к 255 и вы получите переполнение. Многие программисты продолжают работать с 8-битными числами даже на компьютерах с 64-бинтыми словами. Их цель - уместить код и данные в крошечном объеме. Иногда это необходимо, так как процессор может работать с оборудованием с очень небольшим количеством памяти. В остальных случаях такое ограничение необходимо, если риск работы с 8-битными структурами есть и велик. Если вам известно, что вычисления производятся с 8 или 16 битными структурами, то вам необходимо проверять на переполнение.

Слайд 176
Так же, как и с десятичными числами, нам нужны не только положительные числа, но и отрицательные. Поэтому первый бит воспринимается как бит знака.

Слайд 177
Несколько раз я упоминал размер слов. Центральный процессор получает данные из памяти кусками. Старые процессоры получали 8 или 12 бит зараз. Новые получают 32 или 64 бита.Мы называем это размером слова. 64-разрядные компьютеры оперируют 64 битами.

вторник, 16 сентября 2014 г.

Урок 4. Слайд 171-173

Quad damage!

(Это только те репосты, что шли подряд в ленте, есть и еще)
Спасибо, друзья.

Поехали:

Слайд 171
Вместо десятичной арифметики, компьютеры используют двоичную.
На следующих нескольких слайдах я продолжу использовать разряды, но они теперь двоичные, а не десятичные. В них может содержаться 0 или 1.Вот число 15 в двоичной системе: 1111=2^3+2^2+2^1+2^0

Слайд 172
Еще одно соглашение - байт, состоящий из 8 бит, от 2^0 до 2^7.

Слайд 173
У нас есть возможность добавлять бинарные цифры так же, как десятичные, с той разницей, что переполнение происходит чуть быстрее. в десятичной системе 5+5=10.
В двоичной 1+1=10.
В системе из 8 бит это будет записано как  00000010

понедельник, 15 сентября 2014 г.

Урок 4. Слайд 168-170

Найдено у plakhov:

Это вероятности "выживания" фигур и пешек в шахматной партии, посчитанные по базе из 2.2 миллионов (!) турнирных партий.
Довольно неожиданно, но, если вдуматься, логично. В битве лучше всего быть королем, но если уж не так повезло - тогда пешкой где-нибудь с краю.

Поехали:

Слайд 168
Можно добавить больше точности нашему числу просто храня больше цифр в мантиссе. Вся разница между двойной и тройной точностью чисел заключается в количестве цифр мантиссы. Еще способ увеличить диапазон чисел с плавающей точкой - использовать больше цифр в степени. Как мы уже говорили, у нас есть возможность выражать и отрицательные числа в этой арифметике, просто храня знак мантиссы и небольшие числа, храня знак экспоненты.

Слайд 169
Предположим, у вас есть четыре значащих цифры и бит знака мантиссы, две цифры и бит знака экспоненты. Каков будет результат этих вычислений?

Содержимое слайда:
(1234*10^10)+(5678*10^-10)=?
(1234*10^10)*12=?

Слайд 170
Современные компьютеры обычно используют не десятичную, а двоичную систему.

пятница, 12 сентября 2014 г.

Урок 4. Слайд 166-167

Поехали

Слайд 166
Есть ограничение, которому тоже стоит уделить внимание.
Даже если наши числа позволяют отображать большой диапазон значение, у них все еще е сть только четыре значащие цифры.
Это значит, что число 12344 будет храниться как 12340. Для последнего знака нужна еще одна цифра.

Слайд 167
Я часто даю головоломку моим студентам: функцию, извлекающую корень из четырех и спрашиваю, будет ли ошибкой, если программа вернет 1.999999999 вместо 2.
Обычно студенты говорят, что это баг.
Но предположим, что программа хранит только 4 значащие цифры.  в чем разница между 1.9999 и 2 в таком случае? В памяти будет хранится одно и то же число.
предположим тогда, что это не баг, когда 1.9999 интерпретируется как 2.
Что если мы будем извлекать корень из 3.999. Корень из этого числа 1.99975. Для четырех значащих цифр мы все еще получаем 2. Это большая ошибка?
Арифметика с плавающей точкой имеет фундаментальное ограничение. В вычислениях присутствует ошибка округления. После выполнения операции, такой как корень, мы не найдем различий между 1.9995, 1.9999 и 2. Все они будут хранится как 2, но в терминах величины ошибки, будет большей ошибкой приравнять 1.99975 к 2, чем 1.9999

четверг, 11 сентября 2014 г.

Урок 4. Слайд 163-165

Намедни сбылась небольшая мечта, поставил почти весь комплект Deore: манетки,
шатуны,

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

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

В целом - доволен. Отличный повод больше катать и тренироваться.

Поехали:

Слайд 163
Для упрощения читабельности чисел с плавающей точной, есть ряд соглашений.
Мантисса пишется с десятичной точкой после первой значащей цифры.
2.354*10^3=2345

Слайд 164
Вернемся к примеру с переполнением integer.
У нас есть четыре цифры для мантиссы и мы не можем записать число 13777.
Но мы могли бы представить его в виде 1.378*10^4, допуская небольшую потерю точности.

Слайд 165
Но у нас все еще есть проблема. Мы сжали мантиссу до четырех знаков, но где мы будем хранить степень? Без нее у нас есть только 1.378.
Решение - введение отдельного знака для степени. Теперь для записи числа нам необходимо 5 знаков, но в первом мы храним значение степени.
Тут есть один нюанс. Степень может быть как положительной, так и отрицательной. Необходима еще  одна ячейка для хранения знака.

среда, 10 сентября 2014 г.

Урок 4. Слайд 161-162

Когда-то давно, когда я составлял чеклист для я.города, я вписал в него такой пункт:
Там ссылка на статью в вики, в которой перечислены города, в которых есть метро.

Через какое-то время на это были написаны тесты, причем, когда делали задание на тестирование, видимо, ссылка потерялась.
Автотестеры сперва сильно удивлялись, потом ржали над таской, которая звучала как:
Метро должно быть в каждом городе РФ и Украины.
Шутили, спрашивали эстимейты, просили бюджеты, все как положено.
Намедни тест сработал, и я завел баг:

Он уже исправлен. Но какое-то время в моем родном городе тоже было метро:


Поехали:

Слайд 161
В арифметике с фиксированной точкой мы имеем возможность определить, какой диапазон чисел мы будем рассматривать с помощью перемещения десятичной точки.

Например, в последнем заявлении Microsoft говорится, что их выручка составила 62 484 000 тысячи долларов. Это не 62 миллиона долларов, это 62 миллиона тысяч долларов. Все числа до запятой в данном случае - тысячи долларов.

Десятичная точка остается фиксированной, но она не всегда находится между тысячами и их частями, так же как не всегда между целыми числами и их частями.

Слайд 162
Мы можем представить гораздо больше чисел с помощью арифметики с плавающей точкой. в этой арифметике мы представляем каждое число в виде двух чисел, мантиссы и экспоненты.
Примеры:
2345000 = 2.345*10^6
0.02345=2.345*10^-2
Используя те же несколько цифр мы значительно расширяем диапазон значений, которые можем представить.