Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 30.11.2014
Сообщений: 33

Глюки VB 2 - точность вычислений (Single, Double)

18.11.2019, 23:22. Показов 3465. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день как правильно объявить переменную делимого?
Почему правильное объявление переменной ведет к неправильному результату?
Кликните здесь для просмотра всего текста

Visual Basic
1
2
3
4
5
6
7
8
9
Private Sub Form_Load()
Dim b As Single
Dim c As Single
Dim a As Single
b = 0.04
c = 5
a = b / c
Label1.Caption = a
End Sub
Результат отображения
Название: 1.PNG
Просмотров: 91

Размер: 6.3 Кб

Не красивое объявление переменной b но правильный результат
Кликните здесь для просмотра всего текста

Visual Basic
1
2
3
4
5
6
7
8
9
Private Sub Form_Load()
Dim b
Dim c As Single
Dim a As Single
b = 0.04
c = 5
a = b / c
Label1.Caption = a
End Sub
Результат отображения


Как поступить?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.11.2019, 23:22
Ответы с готовыми решениями:

Глюки VB - точность вычислений (Single, Double)
Знатоки VB, подскажите, пожалуйста. Периодически возникает проблема когда работаешь со переменными типа SINGLE или DOUBLE при вычислении...

Точность вычислений при переводе углов в радианы
при переводе углов в радианы alf = Pi * alf / 180 ошибка возникает уже в сотых. Или как можно настроить точность?

Тип данных single/double представление в памяти
Всем привет. Собственно стал вопрос о том, как выглядят типы данных single и double в памяти. Немного погуглив, нашел только стандартное...

26
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
19.11.2019, 08:10
Можете объявить как вещественное число двойной точности.
Double наиболее эффективен для дробных типов данных, так как процессоры на современных платформах выполняют операции с плавающей запятой с двойной точностью.

Visual Basic
1
2
3
4
5
6
7
8
9
Private Sub Form_Load()
Dim b As Double
Dim c As Single ' Double
Dim a As Single ' Double
b = 0.04
c = 5
a = b / c
Label1.Caption = a
End Sub
Тогда как тип данных Single можно использовать если у вас есть очень большое количество переменных, которые содержат небольшие числа с плавающей запятой, тогда хранить ваши Single переменные более эффективно и снизить потребление памяти. Но в современных компах памяти обычно много, я бы всё же делал ставку на быстродействие.
0
0 / 0 / 0
Регистрация: 30.11.2014
Сообщений: 33
19.11.2019, 11:39  [ТС]
Добрый день пробовал тоже самое к сожалению
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38169 / 21104 / 4307
Регистрация: 12.02.2012
Сообщений: 34,693
Записей в блоге: 14
19.11.2019, 12:21
Не столь важно, как объявлять... Важнее - как печатать:

Visual Basic
1
2
3
4
5
6
7
8
9
Sub aaa()
Dim b As Single
Dim c As Single 
Dim a As Single 
  b = 0.04
  c = 5 
  a = b / c
  Debug.Print Format$(a, "0.000")
End Sub
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
19.11.2019, 13:54
Цитата Сообщение от Newzero Посмотреть сообщение
пробовал тоже самое
Странно, наверно всё же зависит от системы и того, как процессор считает.
У меня гуд!
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38169 / 21104 / 4307
Регистрация: 12.02.2012
Сообщений: 34,693
Записей в блоге: 14
19.11.2019, 15:55
Цитата Сообщение от Pro_grammer Посмотреть сообщение
от системы и того, как процессор считает.
- скорее, от версии Офиса
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
19.11.2019, 17:00
Цитата Сообщение от Catstail Посмотреть сообщение
скорее, от версии Офиса
А если Офис вообще на компе не установлен, только VB6?
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38169 / 21104 / 4307
Регистрация: 12.02.2012
Сообщений: 34,693
Записей в блоге: 14
19.11.2019, 17:03
Цитата Сообщение от Pro_grammer Посмотреть сообщение
А если Офис вообще на компе не установлен, только VB6?
- тогда вопрос...
0
63 / 48 / 12
Регистрация: 28.12.2014
Сообщений: 270
19.11.2019, 17:26
В вещественный регистр загружается значение делимого не 0.04, а 0.0399999991059303284. Зашивается, действительно, компилятором VB в исполняемый файл. Это если все переменные объявлены Single.
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
19.11.2019, 18:14
Single и Double принципиально не могут быть точными.
Потому что они так устроены.
1
63 / 48 / 12
Регистрация: 28.12.2014
Сообщений: 270
19.11.2019, 18:45
При объявлении переменной как Double, погрешность репрезентации вещественного числа снижается, что привод к более точному результату расчёта, который при округлении результата дает ответ = 0,008.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38169 / 21104 / 4307
Регистрация: 12.02.2012
Сообщений: 34,693
Записей в блоге: 14
19.11.2019, 20:51
Цитата Сообщение от Замабувараев Посмотреть сообщение
Single и Double принципиально не могут быть точными.
- могут, если представимы конечной двоичной дробью
0
0 / 0 / 0
Регистрация: 30.11.2014
Сообщений: 33
19.11.2019, 22:23  [ТС]
Использую для своих нужд для оптимизации вычислений
дома поднял винду XP и VB6 и офис 2003 поставил чтобы все использовало Microsoft DLL и ядрах одного возраста.
Маленькие программки писать пойдет.

С подобной проблемой сталкивался при написании макросов в EXCEL, в ячейку из переменной попадает значение с такой же проблемой.

Скорее всего это на уровне ниже связано (с выделением памяти при определении переменных).

Решение да есть два/три варианта:
1. Вывод форматированный - но в переменной результат с ошибкой остается, а с этими данными еще нужно чтото будет делать программе
2. Оставить тип как VARIANT
3. Использовать тип Currency - помогает, но думаю не во всех случаях

Но все эти варианты не красивые ибо придется много тестировать и отслеживать все переменные, для достоверности

А может глюк VB6 (SP6)

Добавлено через 3 минуты
Проблема в конкретном приведенном примере
Если бы был результат ожидаемый как 2/3 в десятичном представлении то бы бог с ним, а тут все до конца делится

Пробовал уходить от дробной части делимое умножал на 1000 потом делил и результат потом делил на 1000 - как вариант не потерять значимые цифры - не помогает
0
63 / 48 / 12
Регистрация: 28.12.2014
Сообщений: 270
20.11.2019, 03:22
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Странно, наверно всё же зависит от системы и того, как процессор считает.
У меня гуд!
Тип данных для переменной b поменяйте на Single, тогда будет как у ТС.

Если нужны красивые цифры, то либо на типе данных single использовать функцию round/format, если известно количество значащих цифр после запятой, либо объявить все вещественны переменные типом данных Double.
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
20.11.2019, 07:36
Цитата Сообщение от IDK Посмотреть сообщение
Тип данных для переменной b поменяйте на Single, тогда будет как у ТС.

Для чего? Вы ветку прочитали?
У ТС с Double результат такой же, как и с Single, а у меня не такой.
Сей факт мы тут и пытаемся научно обосновать.
1
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
20.11.2019, 09:39
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Double наиболее эффективен для дробных типов данных, так как процессоры на современных платформах выполняют операции с плавающей запятой с двойной точностью.
FPU выполняет операции с 80 битовыми числами с плавающей запятой, все числа конвертируются в этот формат. Из-за разности форматов могут даже возникать неочевидные вещи такие как отрицательные результаты после инкремента и последующего вычитания из инкремента предыдущего значения. Такое поведение характерно для других компиляторов также, а не только в VB6. К примеру такой код:
Visual Basic
1
2
3
4
  Dim t As Single
 
  t = Timer
  Caption = Timer - t
Будет иногда выдавать отрицательные значения. Объяснение такого поведения можно найти у Хакера на форуме (т.к ссылки нельзя давать, название темы "Странное поведение ф-ции Timer").
Newzero, какой тебе результат то нужен в итоге чтобы был?
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
20.11.2019, 11:35
Цитата Сообщение от The trick Посмотреть сообщение
Dim t As Single
C Single всё предельно ясно.

Интересно другое, почему у меня VB6 с Double

Visual Basic
1
2
3
4
5
6
7
8
9
Private Sub Form_Load()
Dim b As Double
Dim c As Single ' Double
Dim a As Single ' Double
b = 0.04
c = 5
a = b / c
Label1.Caption = a
End Sub
Выдает 0.008, а у ТС (по его словам) 7,999999E -3
От чего это зависит?
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
20.11.2019, 11:51
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Выдает 0.008, а у ТС (по его словам) 7,999999E -3
Не может такого быть, как минимум у Double больше знаков, а по словам ТС написано как у Single.
Просто для проверки:
Visual Basic
1
2
3
4
5
Dim s As Single
Dim o As Double
 
s = 0.04! / 5   ' s = 7,999999E-03
o = s   ' o = 7,99999944865704E-03
Добавлено через 3 минуты
Цитата Сообщение от Pro_grammer Посмотреть сообщение
C Single всё предельно ясно.
С Double тоже самое может выдать, т.к. Double 64-битный, а FPU стек 80.
0
0 / 0 / 0
Регистрация: 30.11.2014
Сообщений: 33
20.11.2019, 16:54  [ТС]
Добрый день

У меня цель установить правильный тип данных (вроде делаю как положено ) или операцию исправления
чтобы при получении данных из переменной были достоверные цифры,
где деление без остатка то получать результат как положено
т.е. 0,04/5= 0,008, а не 7,999999E-03

а 2/3=0,66666 - это уже не суть сколько знаков буду использовать в дальнейшем, поскольку иного результата не будет

Помимо этого данные передаю в EXCEL в ячейках тоже искаженные данные попадают
Если решений нет то думаю припишем еще один глюк и тему закроем.
0
0 / 0 / 0
Регистрация: 30.11.2014
Сообщений: 33
20.11.2019, 17:11  [ТС]
Попробовал на другом компьютере с W7*64 в VBA EXCELe офиса 2016
Видимо что то недоделано однозначно у VB
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Private Sub CommandButton1_Click()
Dim a As Single
Dim b As Single
Dim c As Single
a = 0.04
b = 5
c = a / b
Label1.Caption = c
End Sub
 
Private Sub CommandButton2_Click()
Dim a As Double
Dim b As Double
Dim c As Double
a = 0.04
b = 5
c = a / b
Label2.Caption = c
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.11.2019, 17:11
Помогаю со студенческими работами здесь

Переменные типа Single, Double... продолжит ряд можно?
Здравствуйте. Всем известно, что в VB 6 исполюзуются два типа переменных с плавающей запятой: Single - одинарной точности; Double -...

Точность вычислений у double
Дана задача: "Определить, на сколько нулей заканчивается факториал числа n". Пример: вводим "25", на выходе должны получить...

Точность вычислений в double (Обрезание числа)
Здравствуйте! Дело в том, что мне необходимо выводить большие числа с большим количеством знаков после запятой. Однако и double и float...

Точность Single
Такая проблема: конвертирую StrToFloat в Single, при этом теряется точность, число округляется до целых, если учесть, что это геодезические...

точность вычислений
Известно что в Питоне: 1.001 + 5 = 6.0009999999999994 А хочется чтобы было 6.001 Пользователь хочет видеть красивые числа...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru