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

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

18.11.2019, 23:22. Показов 3606. Ответов 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
Просмотров: 93

Размер: 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
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 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
38208 / 21141 / 4311
Регистрация: 12.02.2012
Сообщений: 34,753
Записей в блоге: 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
38208 / 21141 / 4311
Регистрация: 12.02.2012
Сообщений: 34,753
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
[golang] Конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов.
alhaos 10.06.2026
Задача Реализовать конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов. Сигнатура func Fetch(urls string, maxConcurrent int) Result Пример urls :=. . .
[golang] Состояние гонки (race condition)
alhaos 10.06.2026
Состояние гонки (race condition) Состояние гонки (Race Condition) — это ошибка, возникающая при одновременном доступе нескольких горутин к одним и тем же данным без должной синхронизации. При этом. . .
Взрослые отношения, и почему они не получаются
kumehtar 09.06.2026
Когда в детстве ребёнок не получает от родителей чего-то важного, он лишается не просто приятных переживаний, а основы для формирования определённых внутренних качеств и навыков. Если ребёнок не. . .
[golang] Worker Pool
alhaos 09.06.2026
Worker Pool Worker Pool — паттерн конкурентной обработки задач в Go. Суть: фиксированное количество горутин-воркеров читают задачи из общего канала и пишут результаты в общий канал результатов. . . .
[golang] Pipeline
alhaos 08.06.2026
Pipeline Pipeline — паттерн конкурентной обработки данных в Go. Суть: данные проходят через цепочку независимых стадий, каждая из которых работает в своей горутине и общается с соседями через. . .
Свет внутри себя
kumehtar 07.06.2026
Пусть это будет здесь lIs4oanZS9Y
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru