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

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

18.11.2019, 23:22. Показов 3461. Ответов 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
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
20.11.2019, 17:31
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Newzero Посмотреть сообщение
Видимо что то недоделано однозначно у VB
Покажи код VB со скрином. Тот же код и на C++ будет выдавать аналогичный результат:


Цитата Сообщение от Newzero Посмотреть сообщение
У меня цель установить правильный тип данных (вроде делаю как положено ) или операцию исправления
чтобы при получении данных из переменной были достоверные цифры,
где деление без остатка то получать результат как положено
т.е. 0,04/5= 0,008, а не 7,999999E-03
Так используй Double.
1
0 / 0 / 0
Регистрация: 30.11.2014
Сообщений: 33
20.11.2019, 22:47  [ТС]
Добрый день

Выкладываемый пример в котором проверял типы был кусок программы.
Поменял все типы c Single на Double - помогло.
Почему то при передаче данных из одной переменной в новую также наследуется и тип

Спасибо

0
63 / 48 / 12
Регистрация: 28.12.2014
Сообщений: 270
21.11.2019, 03:52
Цитата Сообщение от Newzero Посмотреть сообщение
Почему то при передаче данных из одной переменной в новую также наследуется и тип
Присваивается значение, тип не наследуется.

Есть стандарт IEEE 754. Когда вы присваиваете значение переменной single, то фактически выполняется присваивание не a = 0.04, но a = 0.0399999991059303284 - отсюда и неточность при расчёте. От языка, как сказал, the trick - не зависит. Для того, чтобы наиболее точно представить в стандарте IEEE 754 вещественное число 0.04, нужно использовать тип данных double, который сможет представить число 0,04 = 0.0400000000000000004 - также и любой другой язык программирования. Стандарт IEEE 754 используется в компьютерной технике для представления вещественных чисел, поддерживается CPU intel/amd и компилятором vb и другими. Используйте Double, если нужна высокая точность, при single она и так не низкая, смотря для чего нужно значение.
1
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
21.11.2019, 08:04
Цитата Сообщение от Newzero Посмотреть сообщение
Поменял все типы c Single на Double - помогло.
Я вам это посоветовал сразу же, в первом своём сообщении + привел выдержку из MSDN с объяснением этого явления.
У меня только 1 вопрос:
Почему мне вы ответили, что не помогло, а теперь вдруг
Цитата Сообщение от Newzero Посмотреть сообщение
Поменял все типы c Single на Double - помогло.
Как так то?
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38168 / 21103 / 4307
Регистрация: 12.02.2012
Сообщений: 34,693
Записей в блоге: 14
21.11.2019, 08:44
Newzero, вместо того, чтобы безапелляционно высказывать глупости ("Видимо что то недоделано однозначно у VB") лучше изучить особенности работы с плавающей запятой
1
0 / 0 / 0
Регистрация: 30.11.2014
Сообщений: 33
23.11.2019, 12:52  [ТС]
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Как так то?
Прошу прощения
Я когда писал про свои опыты я вспоминал Ваш ответ, но не мог понять почему так ведь точности SINGLE было достаточно
Когда появилось выше сообщение про
Есть стандарт IEEE 754. Когда вы присваиваете значение переменной single, то фактически выполняется присваивание не a = 0.04, но a = 0.0399999991059303284 - отсюда и неточность при расчёте. От языка, как сказал, the trick - не зависит. Для того, чтобы наиболее точно представить в стандарте IEEE 754 вещественное число 0.04, нужно использовать тип данных double, который сможет представить число 0,04 = 0.0400000000000000004 - также и любой другой язык программирования. Стандарт IEEE 754 используется в компьютерной технике для представления вещественных чисел, поддерживается CPU intel/amd и компилятором vb и другими. Используйте Double, если нужна высокая точность, при single она и так не низкая, смотря для чего нужно значение.
Все встало на свое место

Добавлено через 6 минут
Цитата Сообщение от Catstail Посмотреть сообщение
Newzero, вместо того, чтобы безапелляционно высказывать глупости ("Видимо что то недоделано однозначно у VB") лучше изучить особенности работы с плавающей запятой
Ну почему безопеляцонно
для значения 0,04 разрядности SINGLE достаточно ? Достаточно
Если бы сразу подсказали что есть информация по указанной Вами статье п.3-п.4 и я ее не брал бы в расчет то согласен.

Добавлено через 5 минут
Тему можно закрыть, всем спасибо
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38168 / 21103 / 4307
Регистрация: 12.02.2012
Сообщений: 34,693
Записей в блоге: 14
23.11.2019, 13:05
Цитата Сообщение от Newzero Посмотреть сообщение
для значения 0,04 разрядности SINGLE достаточно ? Достаточно
- Дробь 0.04 в двоичном виде становится периодической и не может быть представлена точно. Кроме того, в ЯП никаких особых действий над числами с плавающей точкой не выполняется - используются команды микропроцессора. Так что VB здесь не при чем дважды.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.11.2019, 13:05
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
27
Ответ Создать тему
Новые блоги и статьи
Загрузка 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