Округление Single

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Округление Single

Сообщение Debugger » 16.04.2016 (Сб) 1:27

Внезапно, в старом VB6-ном проекте полезли странные баги.
При разборе полётов нашел странную вещь: в некоторых местах, если слева - Single, справа - Single, то происходит округление при присвоении:

Код: Выделить всё
Dim ASKV As Single
'(Immediate pane)
sample = CSng(AX - AXr) ^ 2
? sample
2160188,74506003
askv = sample
? askv
2160189
askv = 1.1
? askv
1,1


Доктор, что я делаю не так?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Округление Single

Сообщение Хакер » 16.04.2016 (Сб) 1:32

Выглядит логично.

Где объявлена askv?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: Округление Single

Сообщение Debugger » 16.04.2016 (Сб) 1:39

Внутри функции. Это как-то влияет?
Переменной, которая так же называется, в проекте нет.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Округление Single

Сообщение Хакер » 16.04.2016 (Сб) 1:40

Debugger писал(а):Внутри функции. Это как-то влияет?

При этом, когда ты запускаешь строчку askv = sample в Immediate Pane, выполнение остановлено прямо в самой этой фукнции, где переменная объявлена?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: Округление Single

Сообщение Debugger » 16.04.2016 (Сб) 1:53

Да, верно. Останавливаю прямо на присвоении.

Интересно, что кусок кода, скопипащенный в отдельный проект, работает должным образом.
Последний раз редактировалось Debugger 16.04.2016 (Сб) 1:55, всего редактировалось 1 раз.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Округление Single

Сообщение Хакер » 16.04.2016 (Сб) 1:55

Всё-таки, какие строчки являются кодом процедуры, а какие выполняются в Immediate Pane? Я думал, что присвоение выполняется в Immediate Pane. Это не так?

И кстати, нет DefInt/DefLng где-нибудь там случайно?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: Округление Single

Сообщение Debugger » 16.04.2016 (Сб) 1:57

https://gyazo.com/1a71a4e1fe157cd46a70143d60a4cfe3

оно выглядит вот так.

Что такое DefInt / DefLng? Переопределение Int/Long?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Округление Single

Сообщение Хакер » 16.04.2016 (Сб) 2:14

Debugger писал(а):Что такое DefInt / DefLng? Переопределение Int/Long?

Ну ты даёшь.
Код: Выделить всё
DefLng A-B, M-K, U,W,Z
DefInt i, s


И заодно, нет ли где-либо применения TDC к переменной ASKV?
Есть ли Option Explicit в проблемной модуле?

Не переводя выполнение с желтой строки, примени Add Watch к переменной ASKV и покажи, что будет в окне watch-ей?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Округление Single

Сообщение ger_kar » 16.04.2016 (Сб) 4:40

И еще в окне 'Locals Window ' можно посмотреть тип переменной. Можно посмотреть до и после присвоения.
Бороться и искать, найти и перепрятать

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Округление Single

Сообщение ger_kar » 16.04.2016 (Сб) 18:18

Ну и что показали исследования и опыты? Где собака порылась? :)
Бороться и искать, найти и перепрятать

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Округление Single

Сообщение The trick » 16.04.2016 (Сб) 21:34

Переменная sample как объявлена? Большое предположение что это не Single. Single не может с такой точностью представить число. Можешь проверить юзая ! постфикс - оно автоматически будет округляться.
UA6527P

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: Округление Single

Сообщение Debugger » 16.04.2016 (Сб) 22:06

The trick писал(а):Переменная sample как объявлена? Большое предположение что это не Single. Single не может с такой точностью представить число. Можешь проверить юзая ! постфикс - оно автоматически будет округляться.

sample никак не объявлен - он устанавливается в Immediate Pane, чтобы показать, что происходит что-то не то.

ger_kar писал(а):Ну и что показали исследования и опыты? Где собака порылась? :)

Пока не проверял пока :( уж больно много багов в этом старом проекте

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Округление Single

Сообщение The trick » 17.04.2016 (Вс) 9:42

Debugger писал(а):
The trick писал(а):Переменная sample как объявлена? Большое предположение что это не Single. Single не может с такой точностью представить число. Можешь проверить юзая ! постфикс - оно автоматически будет округляться.

sample никак не объявлен - он устанавливается в Immediate Pane, чтобы показать, что происходит что-то не то.

Ну и в чем тогда проблема? Ты Double приравниваешь к Single, соответственно значение и округляется, можешь, как я написал, с помощью постфикса проверить точность Single.
UA6527P

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: Округление Single

Сообщение Debugger » 17.04.2016 (Вс) 11:12

The trick писал(а):
Debugger писал(а):
The trick писал(а):Переменная sample как объявлена? Большое предположение что это не Single. Single не может с такой точностью представить число. Можешь проверить юзая ! постфикс - оно автоматически будет округляться.

sample никак не объявлен - он устанавливается в Immediate Pane, чтобы показать, что происходит что-то не то.

Ну и в чем тогда проблема? Ты Double приравниваешь к Single, соответственно значение и округляется, можешь, как я написал, с помощью постфикса проверить точность Single.


Да, всё оказалось просто:
Код: Выделить всё
? csng(1141543.89971855)
1141544
? csng(114154.89971855)
114154,9
? csng(11415.89971855)
11415,9

Single не хватает точности для записи этого числа. Всё пролечилось заменой на Double.

Кстати, сразу выяснилось, что поводом для появления этого бага стало изменение в файле конфигурации масштаба отрисовываемого изображения.
- Что-то меняли? - Нет, ничего не трогали, само сломалось, ещё вчера работало.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Округление Single

Сообщение Хакер » 17.04.2016 (Вс) 13:36

Debugger писал(а):Single не хватает точности для записи этого числа. Всё пролечилось заменой на Double.

Я как-то сразу отмел эту верcию, ориентируясь на слова о том, что перенос кода в другой (маленький) проект решает проблему.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: Округление Single

Сообщение Debugger » 17.04.2016 (Вс) 21:52

Хакер писал(а):
Debugger писал(а):Single не хватает точности для записи этого числа. Всё пролечилось заменой на Double.

Я как-то сразу отмел эту верcию, ориентируясь на слова о том, что перенос кода в другой (маленький) проект решает проблему.


Так оно и было - в этом "другом" проекте использовалась нормальная конфигурация.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 98

    TopList  
cron