Разное

Vba десятичный логарифм: Функция журнала (Visual Basic для приложений)

2.5 Функции в vba

В VBA используются следующие виды функций:

— математические встроенные функции;

— математические функции, не представленные в VBA;

— функции форматирования данных;

— функции преобразования типов

2.5.1 Математические встроенные функции

Таблица 2 — Встроенные математические функции VBA

Функция

Возвращаемое значение

Abs (x)

— абсолютная величина числа

Atn (x)

arctg (x) – арктангенс от значения параметра, заданного в радианах

Sin (x)

sin (x) – возвращает синус угла от значения параметра, заданного в радианах

Cos (x)

cos (x) – косинус указанного в радианах угла

Tan (x)

tg (x) – возвращает тангенс угла от значения параметра, заданного в радианах

Exp (x)

ex – возвращает число e, возведенное в указанную степень, где е – основание натурального логарифма

Log (x)

ln (x) – возвращает натуральный логарифм от значения числового выражения

Sqr (x)

— возвращает квадратный корень числового выражения

Rnd (x)

Случайное число из интервала [0,1). Перед вызовом функции надо использовать оператор Randomize (рандомизации) – запуск генератора псевдослучайных чисел)

Sgn (x)

Возвращает +1, если значение параметра положительно,

-1, если отрицательное,

0, если 0

Fix (x)

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

Int (x)

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

2.

5.2 Математические функции, не представленные в vba

Таблица 3 — Математические функции, непредставленные в VBA

Функция

Возвращаемое значение

Log(X)/Log(10)

lg(х) – возвращает десятичный логарифм от значения числового выражения

Atn

arcsin (x) – возвращает арксинус угла от значения параметра, заданного в радианах

Atn

arccos (x) – возвращает арккосинус угла от значения параметра, заданного в радианах

Cos (x)/Sin (x)

ctg (x) — возвращает котангенс угла от значения параметра, заданного в радианах

Значение числа π

Pi = 4 * Atn (1)

2.

5.3 Функция форматирования данных

Для того чтобы представить выражение отформатированным в специфицированном формате, необходимо воспользоваться функцией Format. Она возвращает значение типа Variant (String), содержащее выражение, отформатированное согласно указанным спецификациям.

Синтаксис:

Format (выражение [ , “Имя формата (или символ формата)“])

Именованные числовые форматы показаны в таблице 4.

Таблица 4 — Именованные числовые форматы

Имя формата

Описание

General Number

Число без разделителя тысяч

Currency

Отображает две цифры справа от десятичной точки

Fixed

Отображает одну цифру слева и две справа от десятичной точки

Standard

Отображает одну цифру слева и две справа от десятичной точки и выводит разделитель тысяч

Percent

Отображает число в виде процентов и выводит две цифры справа от десятичной точки

Scientific

Использует формат с плавающей десятичной точкой

Yes/No

Отображает No, если число равно 0, и Yes – в противном случае

True/False

Отображает False, если число равно 0, и True – в противном случае

On/Off

Отображает Off, если число равно 0, и On – в противном случае

Рисунок 11 — Программа, показывающая работу различных именованных форматов с помощью окна Immediate

Пользовательские числовые форматы показаны в таблице 5. 2, “##.###”)

. (точка)

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

Продолжение таблицы 5

E+,E-, e+, e-

Разделитель мантиссы и порядка в экспоненциальном формате.

Пример. Debug.Print Format (sin(x) * exp(5), “#.###e+##”)

%

Резервирует процентное отображение числа

Пример. Debug.Print Format (0.5, «#.%») (отобразится 50 %)

d,m,y

Резервирует позицию при выводе дня, месяца, года в категории форматов Data

Пример. x-ln2x (интервал от 1 до 10) ШАГ 0.5 нужно написа… -reshimne.ru

Новые вопросы

Ответы

Похожие вопросы


Эскадра капитана Блада стоит в гавани Тортуги и снаряжается в очередной поход. На разные корабли нужно разное:
— на Лахезис нужно то же, что на Атропос, за исключением ямайского рома — пока хватает старых запасов, нет нужды докупать.

— на Атропос нужно то же, что на Клото, только новых матросов в команду набирать не нужно — в последнем похо…

В декартовой системе координат прямоугольник задан координатами двух противоположных вершин.Для заданных точек определите лежат ли о ни внутри прямоугольника или на его границы
решение паскаль…

C++. програмирование
немогу понять чему ровно .i=3 c=2.
1)i+=++c + ++i
2)i-=c— + —i
обясните все пополочкам ато я немогу понять…

Какой минус в подключении персонального компьютера к локальной вычислительной сети представляется наиболее серьезным?

1)Значительные материальные затраты на покупку сетевого оборудования, программного обеспечения, на прокладку соединительных кабелей и обучение персонала

2)Сеть ограничивает возможности перемещения компьютеров, подключе…

Дан одномерный массив, содержащий целые числа. Использовать дополнитель­
ные массивы нельзя. Выполнить следующие действия: С++…

Помогите выполнить 3 и 4 задание.
Очень срочно нужно.
Заранее спасибо….

Математика

Литература

Алгебра

Русский язык

Геометрия

Английский язык

Химия

Физика

Биология

Другие предметы

История

Обществознание

Окружающий мир

География

Українська мова

Українська література

Қазақ тiлi

Беларуская мова

Информатика

Экономика

Музыка

Право

Французский язык

Немецкий язык

МХК

ОБЖ

Психология

Функция журнала в excel (vba) — не дает мне правильного ответа

Вместо функции Int используйте функцию cLng. В то время как Int отсекает десятичные дроби, cLng округляет до Long .

Пример Int отрежет

 Int(99.2) '= 99
Целое(99,5) '= 99
Целое число (99,8) '= 99
 

но cLng округлит

 cLng(99.2) '= 99
cLng(99,5) '= 100
cLng(99,8) '= 100
 

, так как компьютеры и калькуляторы рассчитывают числа, а не алгебраические, вероятно, есть проблема с точностью вычислений и log (1000) / log (10) не ровно Алгебраический 3 , но числовое 3 , что является чем -то вроде 2,9999999999998 , который int будет отключен до 2 , но Clng округлить до 3 .

Обратите внимание, что Excel — это программа для числовых вычислений, и значения типа Double не являются точными значениями. Десятичные дроби (как и в любом стандартном калькуляторе) рассчитываются только с определенной точностью. Итак, Double тип 3 не 3 , а что-то очень близкое к 3 как 2.99999999999998 . Таким образом, функция Log возвращает Double , а также devision Log(1000) / Log(10) возвращает Double , и это не точно 3 , но очень близко к 3 .

Обратите внимание, что это не ошибка, а характер числовых вычислений, которые никогда не бывают точными, а только точными, в то время как алгебраические вычисления могут быть точными. 92

, где цифры — количество цифр, которые должны быть одинаковыми. Пример

 DoubleA = 0,9999999999
DoubleB = 1.0000000001
 

, затем Цифры должны быть <= 9 , чтобы считать их равными.

Если вам нужно делать это часто, удобно использовать для этого функцию:

 Option Explicit
Открытая функция IsDoubleValueTheSame (DoubleA As Double, DoubleB As Double, Optional Digits As Long = 12) As Boolean
    IsDoubleValueTheSame = (DoubleA - DoubleB) ^ 2 < (10 ^ -Digits) ^ 2
Конечная функция
 

и назовите его как

 Debug. Print IsDoubleValueTheSame(0.9999999999, 1.0000000001, 9) 'true
Debug.Print IsDoubleValueTheSame(0.9999999999, 1.0000000001, 10) 'ложь
 

Итак, вернемся к исходному примеру:

 Debug.Print Log(1000) / Log(10) = 3 'false
Debug.Print IsDoubleValueTheSame(Log(1000)/Log(10), 3, 15) 'true
Debug.Print IsDoubleValueTheSame(Log(1000)/Log(10), 3, 16) 'false
 

, что означает Log(1000) / Log(10) на самом деле 3 с точностью до 15 цифры и цифры 16ᵗʰ отличаются.

Дополнительная информация об этом:

  • Числовая точность в Microsoft_Excel (Википедия)
  • Арифметика с плавающей запятой может давать неточные результаты в Excel (документация Microsoft)
  • Сравнить двойное значение в задаче точности VBA (переполнение стека)

Несоответствие между рабочим листом Excel и функциями VBA INT(LOG())

Задавать вопрос

спросил

Изменено 7 лет, 9 месяцев назад

Просмотрено 2к раз

В стандартном модуле кода Excel VBA я создал пользовательскую формулу MyLog10() для получения 10-базового логарифма:

 Публичная функция MyLog10 (ByVal dbl_Input As Double) As Double
    MyLog10 = Журнал (dbl_Input) / Журнал (10)
Конечная функция
 

Протестировано на значение 1000 и получило точный результат 3. Удивительно, но когда функция Int() VBA была применена к результату MyLog10() , получилось 2. То же самое наблюдалось с Fix() Функция VBA (см. следующий тест Sub):

 Sub TestIntMyLog10()
    Debug.Print MyLog10(1000) 'Результат 3 (точный)
    Debug.Print Int(MyLog10(1000)) 'Результат 2 (неточный)
    Debug.Print Fix(MyLog10(1000)) 'Результат 2 (неточный)
Конец сабвуфера
 

Что еще более удивительно, моя пользовательская функция MyLog10(1000) , введенная в рабочий лист Excel как =MyLog10(1000) и =INT(MyLog10(1000)) , в обоих случаях возвращает правильный результат 3.

Любое объяснение этого несоответствия VBA/Worksheet (вероятно, ошибка)?


Кроме того, добавление очень небольшого числа (1E-12) к выходным данным пользовательского VBA MyLog10() дало правильный результат в обоих случаях (с/без дополнительных Int() ):

 Debug.Print Int (Log10(1000)+1E-12) 'Результат 3 (точный)
 
  • excel
  • int
  • worksheet-function
  • logarithm
  • vba

After trying multiple type conversions, the solution was found: it is using a Decimal type as custom Log Function MyLog10Decimal return type. Ниже приведен фрагмент кода, содержащий универсальное решение VBA и тест Sub TestIntMyLog10() :

9.0014 ' РЕШЕНИЕ: использование десятичного типа вывода: Int() и Fix() возвращают правильное значение Публичная функция MyLog10Decimal (ByVal dbl_Input As Double) как вариант MyLog10Decimal = CDec (Журнал (dbl_Input) / Журнал (10)) Конечная функция 'Проблема: при использовании типа вывода double: Int() и Fix() могут возвращать неправильный Публичная функция MyLog10 (ByVal dbl_Input As Double) As Double MyLog10 = Журнал (dbl_Input) / Журнал (10) Конечная функция Sub TestIntMyLog10 () ' ** тестовый образец: входное число 1000 'использование типа вывода журнала double: Int() и Fix() дают неправильные результаты Debug.Print MyLog10(1000) 'Результат 3 (точный) Debug.Print Int(MyLog10(1000)) 'Результат 2 (неточный) Debug.Print Fix(MyLog10(1000)) 'Результат 2 (неточный) 'использование десятичного типа вывода журнала: Int() и Fix() дают правильные результаты Debug. Print Int(MyLog10Decimal(1000)) 'Результат 3 (точный) Debug.Print Int(MyLog10Decimal(1000)) 'Результат 3 (точный) Debug.Print Fix(MyLog10Decimal(1000)) 'Результат 3 (точный) ' ** тестовый образец: входное число 0,001 'используя тип вывода журнала double: Fix() дает неверные результаты Debug.Print MyLog10(0.001) 'Результат -3 (точный) Debug.Print Int(MyLog10(0.001)) 'Результат -3 (точный) Debug.Print Fix(MyLog10(0.001)) 'Результат -2 (неточный) 'использование десятичного типа вывода журнала: Int() и Fix() дают правильные результаты Debug.Print Int(MyLog10Decimal(0.001)) 'Результат -3 (точный) Debug.Print Int(MyLog10Decimal(0.001)) 'Результат -3 (точный) Debug.Print Fix(MyLog10Decimal(0.001)) 'Результат -3 (точный) Конец сабвуфера

Небольшое пояснение. VBA не поддерживает тип Decimal в качестве параметра/вывода функции, поэтому он объявлен Variant с примененным к нему преобразованием CDec. До сих пор он был протестирован на нескольких входных данных (> 1 и < 1) и возвращает правильные результаты.

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

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