powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / глюк?
11 сообщений из 11, страница 1 из 1
глюк?
    #33903960
nagoHaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Весело у VBA с математикой:

? (12.47 - 12.47 \ 1) * 100
47,0000000000001

? (12.45 - 12.45 \ 1) * 100
44,9999999999999


Варианты?
...
Рейтинг: 0 / 0
глюк?
    #33903998
Melkiades
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А чего вы хотите? Все правильно.

? (12.47 - 12) * 100
47,0000000000001

? (12.45 - 12) * 100
44,9999999999999
...
Рейтинг: 0 / 0
глюк?
    #33904003
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
? round((12.47 - 12.47 \ 1) * 100, 12)
47
...
Рейтинг: 0 / 0
глюк?
    #33904004
Goldminer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nagoHaK
Варианты?
Читать книжки об основах вычислений с плавающей точкой.
...
Рейтинг: 0 / 0
глюк?
    #33904490
Ashton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нормальные ошибки при использовании чисел с плавающей точкой. В хорошей книге по VBA обязательно расписан этот момент. Советую как-нибудь прочитать.

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

Код: plaintext
1.
?(CDec( 12 . 47 ) - CDec( 12 . 47 ) \  1 ) *  100 
 47 
...
Рейтинг: 0 / 0
глюк?
    #33905774
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Deciminal теряет точность. Это раз.
Два,так лучше округлять.
Три, скорость Varianta в т.ч. Deciminal меньше чем тот же Double.
4) Точность double больше Single.

? (12.47! - 12.47 \ 1) * 100!
47,0000267028809
? (12.47# - 12.47 \ 1) * 100#
47,0000000000001

? (12.45! - 12.45 \ 1) * 100!
44,9999809265137
? (12.45# - 12.45 \ 1) * 100#
44,9999999999999
...
Рейтинг: 0 / 0
глюк?
    #33905800
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все относительно. Не надо заморачиваться над скоростью Variant, т.к. обращение к полю объекта (К полю рекордсета например) медленнее чем обращение к варианту.
...
Рейтинг: 0 / 0
глюк?
    #33905954
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Worobjoff, вот уж не уверен... Все операции с Variant происходят через вызовы функций msvbm60.dll
Что быстрее будет зависеть от объекта. Если скорость на данном участке кода критична, то лучше сравнить тестом.
...
Рейтинг: 0 / 0
глюк?
    #33906001
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сомневаюсь что критично.
Да, вариант работает примерно на два порядка медленнее чем double.
Но речь идет о наносекундах. А там же "делить", потом "умножить"!
А если еще и обращение к полю рекордсета где-то, то эффект от замены варианта на double близок к нулю.

Есть более тяжеловесная оптимизация. Исключение лишних срабатываний событий контролов или объектов например.

Но мы отклонились от темы.
...
Рейтинг: 0 / 0
глюк?
    #33907441
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну а если надо 1** *** *** операций с Double?
явно что Variant сделает то же в 2 если не больше раза медленней.
Тот же Mid() становится на 20% быстрее, если не получать результат в Variant а потом не переводить в String. (я о Mid$())

Вот и думайте, нужна ли вам скорость?
...
Рейтинг: 0 / 0
глюк?
    #33908379
Goldminer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
? CDec( 1 ) / CDec( 3 ) * CDec( 3 )
  0 . 9999999999999999999999999999  
МАТЕМАТИКУ приближенных вычислений не обмануть никакими типами. Просто десятичные округления кажутся естественными (такими, как в школе), а двоичные неожиданными. А дело в том, что числа, что круглые в десятичной системе не круглы в двоичной и наоборот.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / глюк?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]