Что такое эпсилон в программировании
Перейти к содержимому

Что такое эпсилон в программировании

  • автор:

Что такое машинный эпсилон?

В питоне есть sys.float_info.epsilon и эта величина является машинным эпсилоном. Это я понял.

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

В последней строчке, нижеследующего кода, я делю машинный эпсилон на 2 и получаю значение меньше машинного эпсилона, потом я это значение складываю с единицей и в результате получаю число чуть больше единицы, но это «чуть», меньше числа, которое компьютер может представить корректно и поэтому компьютер это «чуть» округляет до нуля и в итоге, в последней строчке, я получаю единицу без изменений.

Итого у меня два вопроса:
1) Правильно ли я понимаю, что машинный эпсилон это минимальная разница между двумя числами, с которой компьютер может работать без погрешностей?

Что такое точность epsilon?

Напишите программу, которая оценивает значение математической константы e по формуле e*=*1*+*1/1!*+*1/2!*+*1/3!*+*. с заданной введенной точностью epsilon.

ну вот написал я прогу, Е у меня высчитывается, а что за ЭПСИЛОН? какона работает как ее задать? зачем она ваще нужна и где могла бы пригодиться?

Что такое файловый буфер? Что такое режим (модификатор) доступа, при работе с файлами?
Что такое файловый буфер? Что такое режим (модификатор) доступа, при работе с файлами?

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

Что такое рекурсивный тип данных? Что такое конструкция рекурсивного типа?
Что такое рекурсивный тип данных? Что такое конструкция рекурсивного типа?

Что такое напряжение и что такое сила тока с позиции заряженных частиц
Объясните пожалуйста, что такое напряжение и что такое сила тока с позиции заряженных частиц.

Сообщение от SadiQ228
Сообщение от SadiQ228
Сообщение от SadiQ228

пошарил значит на википедии, и вот что там нашел:

Эпсилон в программировании — точность численного типа данных (наименьшее положительное значение eps, для которого будет соблюдаться неравенство 1 + eps > 1).

Упоминания о чем-то схожем попадаются в книжке Подбельского В. В. " Введение в программирование на языке си " 2004 года, которую можно откопать, например тут, в ней, на странице 83 приведен алгоритм "оценки машинного нуля", и сдается мне, что этот мышиный ноль именно то, что вам нужно. Если описать эту зверушку в коде, получится примерно так:

Сообщение от SadiQ228

результат вывода странный, что я делаю не так?

Добавлено через 17 минут
например при EPSILON = 0.5 а X = 2 выдает INF в выводе

Добавлено через 36 минут
Только что заменил глупую ошибку в функции подсчета, вроде заработало, но прошу экспертной оценки

Сообщение от SadiQ228

— очень плохой код. Прежде, чем программировать, нужно вывести рекуррентную формулу, которая связывает следующий член ряда с предыдущим:

Теперь пишем код:

Сообщение от SadiQ228

Сообщение от COKPOWEHEU

— нормальный — это библиотечный? Так мой код к нему весьма близок. А при отрицательном аргументе ряд станет знакочередующимся и действительно будет потеря точности. Избежать этой потери можно так:

Сообщение от Catstail
Сообщение от Catstail

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

Добавлено через 1 час 16 минут
Итак, результаты
библиотечный exp(): 0.040448 мкс
функция SadiQ228’а: 1.07945 мкс
функция Catstail’а: 0.142243 мкс
То есть способ с использованием предыдущего значения в 7,5 раз быстрее "лобового", но в 3,5 раза медленнее библиотечного (наверняка там пошаманили с оптимизациями). Если поставить epsilon = 1e-5 то результаты ближе:
exp(): 0.040998
SadiQ228’а: 0.814409
Catstail’а: 0.0630968

Машинный эпсилон

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

a+b = a при b 0

https://amdy.su/wp-admin/options-general.php?page=ad-inserter.php#tab-8

Более того, для сложения не выполняется закон ассоциативности:

Действительно, пусть ε — максимальное плавающее число среди чисел, удовлетворяющих условию

(приведенные выше рассуждения показывают, что такие числа существуют). Тогда

поскольку левая часть неравенства равна единице, а правая строго больше единицы (это следует из максимальности числа ε).

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

Оценим величину машинного эпсилона для типа double. Число 1.0 записывается в плавающей форме как

Порядок плавающего числа 1.0 равен нулю. При сложении 1.0 с числом ε производится выравнивание порядка путем многократного сдвига мантиссы числа ε вправо и увеличения его порядка на 1. Поскольку все разряды числа ε должны в результате выйти за пределы разрядной сетки, должно быть выполнено 53 сдвига. Порядок числа ε после этого должен стать равным порядку числа 1.0, т.е. нулю. Следовательно, изначально порядок числа ε должен быть равным -53:

где m — число в диапазоне от единицы до двух. Таким образом, величина машинного эпсилона составляет примерно

2 -53 10 -16

Приблизительно точность вычислений составляет 16 десятичных цифр. (Это также можно оценить следующим образом: 53 двоичных разряда составляют примерно 15.95 десятичных, поскольку 53/log210 53/3.321928 15.95.)

В случае четырехбайтовых плавающих чисел (тип float языка Си) точность вычислений составляет примерно 7 десятичных цифр. Это очень мало, поэтому тип float чрезвычайно редко применяется на практике. К тому же процессор сконструирован для работы с восьмибайтовыми вещественными числами, а при работе с четырехбайтовыми он все равно сначала приводит их к восьмибайтовому типу. В программировании следует избегать типа float и всегда пользоваться типом double.

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

Кроме потери точности, при операциях с вещественными числами могут происходить и другие неприятности:

переполнение — когда порядок результата больше максимально возможного значения. Эта ошибка часто возникает при умножении больших чисел;

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

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

бесконечно большое число — это плавающее число с очень большим положительным порядком и, таким образом, очень большое по абсолютной величине. Оно может иметь знак плюс или минус;

бесконечно малое, или денормализованное, число — это ненулевое плавающее число с очень большим отрицательным порядком (т.е. очень маленькое по абсолютной величине);

Not a Number, или NaN — двоичный код, который не является корректным представлением какого-либо вещественного числа.

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

Машинный эпсилон

Плавающая запятая — форма представления дробных чисел, в которой число хранится в форме мантиссы и показателя степени. При этом число с плавающей запятой имеет фиксированную относительную точность и изменяющуюся абсолютную. Наиболее часто используемое представление утверждено в стандарте IEEE 754. Реализация математических операций с числами с плавающей запятой в вычислительных системах может быть как аппаратная, так и программная.

Содержание

«Плавающая запятая» и «плавающая точка»

Так как в некоторых, преимущественно англоязычных и англофицированных, странах (см. подробный список Decimal separator (англ.) ) при записи чисел целая часть отделяется от дробной точкой, то в терминологии этих стран фигурирует название «плавающая точка» (floating point (англ.) ). Так как в России целая часть числа от дробной традиционно отделяется запятой, то для обозначения того же понятия используется термин «плавающая запятая».

Происхождение названия

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

Преимущество использования представления чисел в формате с плавающей запятой над представлением в формате с фиксированной запятой (и целыми числами) состоит в том, что можно использовать существенно больший диапазон значений при неизменной относительной точности. Например, в форме с фиксированной запятой число, занимающее 8 разрядов в целой части и 2 разряда после запятой, может быть представлено в виде 123456,78; 8765,43; 123,00 и так далее. В свою очередь, в формате с плавающей запятой (в тех же 8 разрядах) можно записать числа 1,2345678; 1234567,8; 0,000012345678; 12345678000000000 и так далее.

Скорость выполнения компьютером операций с числами, представленными в форме с плавающей запятой, измеряется в англ. FLOPS — число операций с плавающей запятой в секунду ),

Структура числа

Число с плавающей запятой состоит из:

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

Нормальная форма

Нормальной формой числа с плавающей запятой называется такая форма, в которой мантисса (без учёта знака) находится на полуинтервале [0; 1). Число с плавающей запятой, находящееся не в нормальной форме теряет точность по сравнению с нормальной формой. Такая форма записи имеет недостаток: некоторые числа записываются неоднозначно (например, 0,0001 можно записать в 4 формах — 0,0001 * 10 0 , 0,001 * 10 -1 , 0,01 * 10 -2 , 0,1 * 10 -3 ), поэтому распространена (особенно в информатике) также другая форма, в которой мантисса принимает значения от 1 (включительно) до 10 (не включительно). В такой форме любое число (кроме 0) записывается единственным образом. Недостаток заключается в том, что в таком виде невозможно представить 0, поэтому представление чисел в информатике предусматривает специальный признак (бит) для числа 0.

Использование в вычислительных машинах

В вычислительных машинах показатель степени принято отделять от мантиссы буквой «E» (exponent). Например, число 1,528535047 × 10 -25 в большинстве языков программирования высокого уровня записывается как 1.528535047E-25.

Краткий обзор

Существует несколько способов того, как строки из цифр могут представлять числа:

1\le a<q

  • Наиболее распространённый путь представления значения числа из строки с цифрами — в виде целого числа — запятая (radix point) по-умолчанию находится в конце строки.
  • В общем математическом представлении строка из цифр может быть сколь угодно длинной, а положение запятой обозначается путём явной записи символа запятой (или, на Западе, точки) в нужном месте.
  • В системах с представлением чисел в формате с фиксированной запятой существует определённое условие относительно положения запятой. Например, в строке из 8 цифр условие может предписывать положение запятой в середине записи (между 4-й и 5-й цифрой). Таким образом, строка «00012345» обозначает число 1,2345 (нули слева всегда можно отбросить).
  • В экспоненциальной записи используют стандартный (нормальный?) вид представления чисел. Число считается записанным в стандартном виде, если оно записано в виде aqn , где a такое, что , называется мантиссой, n — целое, называется показатель степени и q — целое, основание системы счисления (на письме это обычно 10). То есть в мантиссе запятая помещается сразу после первой значащей (не равной нулю) цифры, считая слева направо, а дальнейшая запись даёт информацию о действительном значении числа. Например, период обращения (на орбите) спутника планеты ЮпитераИо́, который равен 152853,5047 с, в стандартном виде можно записать как 1,528535047 × 10 5 . Побочным эффектом ограничения на значения мантиссы является то, что в такой записи невозможно изобразить число 0.
  • Запись в форме с плавающей запятой похожа на запись чисел в стандартном виде, но мантисса и экспонента записываются раздельно. Мантисса записывается в формате с фиксированной запятой, подразумеваемой после первой цифры. Возвращаясь к примеру с Ио́, запись в форме с плавающей запятой будет 1528535047 с показателем 5. Это означает, что записанное число в 10 5 раз больше числа 1,528535047, то есть для получения подразумеваемого числа запятая сдвигается на 5 разрядов вправо. Однако, запись в форме с плавающей запятой используется в основном в электронном представлении чисел, при котором используется основание системы счисления 2, а не 10. Кроме того, в двоичной записи мантисса обычно денормализована, то есть запятая подразумевается до первой цифры, а не после, и целой части вообще не имеется ввиду — так появляется возможность и значение 0 сохранить естественным образом. Таким образом, десятичная 9 в двоичном представлении с плавающей запятой будет записана как мантисса +1001000. 0 и показатель +0. 0100. Отсюда, например, беды с двоичным представлением чисел типа одной десятой (0,1), для которой двоичное представление мантиссы оказывается периодической двоичной дробью — по аналогии с 1/3, которую нельзя конечным количеством цифр записать в десятичной системе счисления.

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

0,12 × 0,12 = 0,0144

в нормальной форме представляется в виде

(1,20 × 10 −1 ) × (1,20 × 10 −1 ) = (1,44 × 10 −2 ).

В формате с фиксированной запятой мы бы получили вынужденное округление

0,120 × 0,120 = 0,014.

Мы потеряли крайний правый разряд числа, так как данный формат не позволяет запятой «плавать» по записи числа.

Диапазон чисел, представимых в формате с плавающей запятой

Диапазон чисел, которые можно записать данным способом, зависит от количества бит, отведённых для представления мантиссы и показателя. На обычной 32-битной вычислительной машине, использующей двойную точность (64 бита), мантисса составляет 52 бита + 1 знаковый, показатель — 11 бит. Таким образом получаем диапазон точности примерно от 4,94 × 10 −324 до 1.79 × 10 308 (от 2 −52 × 2 −1022 до

1 × 2 1024 ). Пара значений показателя зарезервирована для обеспечения возможности представления специальных чисел. К ним относятся значения бесконечность), получающихся в результате операций типа деления на ноль нуля, положительных и отрицательных чисел. Также сюда попадают денормализованные числа, у которых мантисса меньше единицы. В специализированных устройствах (например GPU) поддержка специальных чисел часто отсутствует. Существуют программные пакеты, в которых объём памяти выделенный под мантиссу и показатель задаётся программно, и ограничивается лишь объёмом доступной памяти ЭВМ.

  • S — знак, E — показатель степени, I — целая часть, F — дробная часть
  • Так же, как и для целых, знаковый бит — старший.

Машинный эпсилон

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

Машинным эпсилоном называется наименьшее положительное число ε такое, что 1 \oplus \varepsilon \neq 1(знаком \oplusобозначено машинное сложение). Грубо говоря, числа a и b, соотносящиеся так, что 1 < \frac a b < 1+\varepsilon, машина не различает.

См. также

Литература

  • Н. А. Криницкий, Г. А. Миронов, Г. Д. Фролов. Программирование. — Государственное издательство физико-математической литературы. — Москва, 1963
  • Генри С. Уоррен, мл.Глава 15. Числа с плавающей точкой // Алгоритмические трюки для программистов = Hacker’s Delight. — М.: «Вильямс», 2007. — С. 288. — ISBN 0-201-91465-4 коды с фиксированной запятой

Wikimedia Foundation . 2010 .

Полезное

Смотреть что такое «Машинный эпсилон» в других словарях:

Машинный ноль — Эта статья нуждается в дополнительных источниках для улучшения проверяемости. Вы можете помочь улучшить эту статью, добавив ссылки на авторитетные источники. Не по … Википедия

Машинное эпсилон — Машинный ноль (англ. computer zero) представление нуля в вычислительной системе. Машинным нулём обозначаются числа, абсолютная величина которых меньше наименьшей ненулевой величины из диапазона изменения чисел данной вычислительной системы. [1]… … Википедия

Запятая плавающая — Плавающая запятая форма представления дробных чисел, в которой число хранится в форме мантиссы и показателя степени. При этом число с плавающей запятой имеет фиксированную относительную точность и изменяющуюся абсолютную. Наиболее часто… … Википедия

Плавающая запятая — форма представления дробных чисел, в которой число хранится в форме мантиссы и показателя степени. При этом число с плавающей запятой имеет фиксированную относительную точность и изменяющуюся абсолютную. Наиболее часто используемое представление… … Википедия

Плавающая точка — Плавающая запятая форма представления дробных чисел, в которой число хранится в форме мантиссы и показателя степени. При этом число с плавающей запятой имеет фиксированную относительную точность и изменяющуюся абсолютную. Наиболее часто… … Википедия

Числа с плавающей точкой — Плавающая запятая форма представления дробных чисел, в которой число хранится в форме мантиссы и показателя степени. При этом число с плавающей запятой имеет фиксированную относительную точность и изменяющуюся абсолютную. Наиболее часто… … Википедия

БЭСМ — (сокращение от Большая (или Быстродействующая) электронно счётная машина)  серия советских электронных вычислительных машин общего назначения, предназначенных для решения широкого круга задач. Разработка Института точной механики и… … Википедия

ЯЗЫК ПРОГРАММИРОВАНИЯ — знаковая система, применяемая для записи процессов решения задач на ЭВМ; средство общения пользователя с ЭВМ, позволяющее на формально логическом уровне описывать последовательность операции по обработке информации. Основу Я. п. составляют… … Сельско-хозяйственный энциклопедический словарь

язык программирования — язык программирования, знаковая система, применяемая для записи процессов решения задач на ЭВМ; средство общения пользователя с ЭВМ, позволяющее на формально логическом уровне описывать последовательность операций по обработке информации. Основу… … Сельское хозяйство. Большой энциклопедический словарь

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *