Получить Эпсилон машины в Microsoft Excel - PullRequest
6 голосов
/ 21 февраля 2012

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

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

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

Мои поиски в Интернете в основном вызвали дискуссии о том, как отобразить символ Epsilon.

Спасибо.

Ответы [ 3 ]

7 голосов
/ 21 февраля 2012

Excel всегда работает на двойниках IEEE.

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

=2^-1022

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

=2^-52
4 голосов
/ 21 февраля 2012

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

2 голосов
/ 21 февраля 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,22E-16, и это странно, потому что я могу написать =2^-113 в ячейке и получить 9,62965E-35.

РЕДАКТИРОВАТЬ :

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

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

...