Получить Эпсилон машины в 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