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

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

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

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

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

Благодарю.

3 ответа

Решение

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

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

=2^-1022

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

=2^-52

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

Вы можете написать подпрограмму 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

Другие вопросы по тегам