Получить машинный эпсилон в Microsoft Excel

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

Есть ли способ, желательно через функцию, вернуть эпсилон (т.е. наименьшее ненулевое число, которое может быть представлено в вычислениях Excel)? Если его нельзя получить с помощью функции, есть ли быстрый способ вычислить его с помощью компактной функции?

Чтобы было ясно, я не ищу решение на основе VBA, мне нужно решение на основе формулы/электронной таблицы Excel, которое не требует запуска макросов.

Мои поиски в Интернете в основном приводили к обсуждению того, как отображать символ Эпсилон.

Спасибо.


person SSilk    schedule 21.02.2012    source источник


Ответы (3)


Excel всегда работает с дубликатами IEEE.

Выражение не-VBA, которое даст вам наименьшее неденормализованное число с плавающей запятой больше 0,

=2^-1022

С другой стороны, машинный эпсилон — это наименьшее число, которое можно прибавить к 1 и получить число, большее 1. Для двойной точности это дается выражением

=2^-52
person phoog    schedule 21.02.2012
comment
Правильно, и поместите это в определенное имя, если вам это нужно более одного раза. - person Tim Mayes; 21.02.2012

Microsoft определяет ограничения точности чисел с плавающей запятой для XL. Наименьшее число с плавающей запятой указано как 2.2250738585072E-308 в идентификатор статьи службы поддержки Microsoft: 78113. Когда я ввожу это число в свою электронную таблицу, оно фактически сохраняет 0 с плавающей запятой, но если я сохраняю 2.2250738585073E-308 (я добавил 1 к младшей значащей цифре), я могу видеть все цифры. Я вижу, вы попросили машинный эпсилон, но, поскольку вы используете XL, то, что вы действительно увидите, это эпсилон библиотеки с плавающей запятой C/C++. См. раздел Microsoft Developer Network xlfRegister (Form 1). .

person user1223760    schedule 21.02.2012

Вы можете написать подпрограмму VBA, например:

 Public Sub ComputeMachineEpsilon()
     Dim g, ex, eps As Double
     Dim i As Long
     g = 1
     i = 0
     Do
        i = i + 1
        g = g / 2
        ex = g * 0.98 + 1
        ex = ex - 1
        If ex > 0 Then eps = ex
     Loop While ex > 0

     MsgBox ("No. of Iterations " & i)
     MsgBox ("Machine Epsilon is " & eps)

    End Sub

Но на моей машине выдает 2,22Е-16, и это странно, ведь я могу написать =2^-113 в ячейке и получить 9,62965Е-35.

ИЗМЕНИТЬ:

=1*(0,5-0,4-0,1)

Я получаю: -2,78E-17

person vulkanino    schedule 21.02.2012
comment
Спасибо за ответ. Однако я надеялся на решение, не основанное на VBA, то есть на решение, которое возвращает Epsilon с использованием функций Excel или функций электронных таблиц. Я бы предпочел не запускать никаких макросов. Извините, я не ясно выразился по этому поводу. Я обновил свой вопрос, чтобы уточнить этот момент. Спасибо. - person SSilk; 21.02.2012