0 / 0 / 0
Регистрация: 30.11.2014
Сообщений: 33

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

18.11.2019, 23:22. Показов 3563. Ответов 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
Модератор
10060 / 3905 / 884
Регистрация: 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
38203 / 21135 / 4310
Регистрация: 12.02.2012
Сообщений: 34,746
Записей в блоге: 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
38203 / 21135 / 4310
Регистрация: 12.02.2012
Сообщений: 34,746
Записей в блоге: 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru