Страница: 1 | 2 |
Вопрос: можно ли доверять вычислениям в VB6?
Добавлено: 13.02.07 02:01
Автор вопроса: DimDoc
Здравствуйте ВСЕ!
заметил странную вещь - при сложении двух чисел (as single) в следующем коде:
Option Explicit
Dim X As Single
Const Y As Single = 0.05
Private Sub Command1_Click()
Dim i As Integer
For i = 0 To 30
X = X + Y
Print X
Next i
End Sub
Private Sub Form_Load()
X = 1.2
End Sub
получеам следующее:
1,25
1,3
1,35
1,4
1,45
1,5
1,55
1,6
1,65
1,7
1,75
1,799999
1,849999
и т.д.???
если заменить Single на Double - результат будет почти тотже. т.е. ошибка всёравно будет, только позднее.
если же вычислять с типом Currency - ошибки не будет.
Пробовал решить задачу в Excel - ошибки нет!
Кто знает - в чём дело???
Спасибо ВСЕМ!
Ответы
Всего ответов: 19
Номер ответа: 1
Автор ответа:
Viper
ICQ: 249094859
Вопросов: 0
Ответов: 310
Профиль | | #1
Добавлено: 13.02.07 10:51
Еще один... Срочно учить матчасть об арифметике с плавающей запятой
Номер ответа: 2
Автор ответа:
Barsik
Разработчик Offline Client
ICQ: 343368641
Вопросов: 17
Ответов: 686
Web-сайт:
Профиль | | #2
Добавлено: 13.02.07 14:29
2viper:
ага... блесни знаниями в математике
Номер ответа: 3
Автор ответа:
Fever
Вопросов: 60
Ответов: 808
Профиль | | #3
Добавлено: 13.02.07 18:51
2Viper Хто на кого похож ты на EROSа или он на тебя ?
Номер ответа: 4
Автор ответа:
Viper
ICQ: 249094859
Вопросов: 0
Ответов: 310
Профиль | | #4
Добавлено: 14.02.07 11:24
Я похож на себя...
Номер ответа: 5
Автор ответа:
Fever
Вопросов: 60
Ответов: 808
Профиль | | #5
Добавлено: 14.02.07 13:19
А оба про матчасть грузите
Номер ответа: 6
Автор ответа:
DimDoc
Вопросов: 21
Ответов: 104
Профиль | | #6
Добавлено: 14.02.07 15:02
Спасибо!
Умный Вы однако.
Может займётесь "грамотой об русском"?
Или делать нечего?
НЕ ЗНАЕШЬ - НЕ ГАВКАЙ VIPER ХРЕНОВ
Номер ответа: 7
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #7
Добавлено: 14.02.07 16:09
Прикинь, он как раз знает. И он тебе ответил, в чём дело, первым же постом. Только ты не понял ни хрена, по всей видимости. Зато гавкать, наверное, думаешь что умеешь. Но не умеешь и это. Обидно. Но ничего. Можно пойти и почитать книжку серии "<неважно что> for dummies", постепенно подготавливая не привыкший к работе ум к понимаю ответа, данного в первом посте.
Номер ответа: 8
Автор ответа:
Fever
Вопросов: 60
Ответов: 808
Профиль | | #8
Добавлено: 14.02.07 16:19
В вычислениях с плавающей точкой всегда есть погрешность. Это связано с представлением данных на PC. В циклн происходит множество опреаций, поэтому и результат соответствено портится много раз. Изначально это незаметно,но потом приобретает вид этих самых 9999999 и 00000001.
Есть 2 пути решения
1. Уменьшить количество операций.
print 1.2 + i * 0.05
2. Использовать дробные числа без плавающей точки.
Простейший метод их представления - обычные целые.
Dim X As Long
Const Y As Long = 5
Private Sub Form_Load()
X = 120
End Sub
Private Sub Command1_Click()
Dim i As Integer
For i = 0 To 30
X = X + Y
Print (CSng(X) / 100)
Next i
End Sub
В этом примере X все равно преобразуется к числу с плавающей запятой, однако можно обойтись и без этого.
Номер ответа: 9
Автор ответа:
AgentFire
ICQ: 192496851
Вопросов: 75
Ответов: 3178
Профиль | | #9
Добавлено: 14.02.07 16:56
А еще можно в нужный момент для верности просто округлить
Номер ответа: 10
Автор ответа:
DimDoc
Вопросов: 21
Ответов: 104
Профиль | | #10
Добавлено: 14.02.07 22:38
Спасибо большое FEVER.
Просто и доходчиво.
Если кого обидел - простите!
Математику 25 лет назад в школе учил.
И сейчас с ней не связан по профессии.
Конечно, если напрячься - всё изучить можно.
тогда и форум, наверное не нужен будет...
и последнее...
если переменную объявить как Currency - ошибка тоже не появляется. можно ли так поступить?
Номер ответа: 11
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #11
Добавлено: 15.02.07 11:04
А при чем тут, собственно, EROS?
Если ты считаешь, что учить мат.часть это равносильно "грузить", то я тебе сочувствую.. Ибо мат.часть(теория) это то, без чего ни один уважающий себя программист необходится. Причем практически ежедневно. А вот из за незнания таковой(или явного нежелания знать) и появляются на форуме тупые и идиотские вопросы, на которые даже отвечать впадлу.. По той простой причине, что людям просто ЛЕНЬ напрячь свою извилину и как минимум попытаться с нею разобраться самостоятельно используя литературу, интернет и МСДН.. А вместо этого мы ежедневно тут наблюдаем "ХАЧЮ КОД ШТОП ПРАГРАМУ НИ ВИДНА БЫЛА".. Грустно становится от таких топиков... ((( Они ведь даже не спрашивают: Как сделать? или Почему не работает? Где ошибка? и т.д... им просто дай код и все тут... ((
Номер ответа: 12
Автор ответа:
DimDoc
Вопросов: 21
Ответов: 104
Профиль | | #12
Добавлено: 15.02.07 20:14
Уважаемый EROS!
А Вы тут, собственно и ни причём...
Ни Вы вопрос задавали, Ни Вы на него отвечали.
Вы и вопроса - то не читали...
Зато сколько умудрённого возмущения!
Номер ответа: 13
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #13
Добавлено: 15.02.07 20:28
Уважаемый DimDoc!
Вы тем более тут не при чем!
Мой ответ к Вам лично никакого отношения не имеет и адресован он был абсолютно другому человеку! И Ваше мнение на мой топик меня абсоютно не интересует ...
Номер ответа: 14
Автор ответа:
DimDoc
Вопросов: 21
Ответов: 104
Профиль | | #14
Добавлено: 16.02.07 02:33
Уважаемый EROS!
Спасибо за разъяснения!
Номер ответа: 15
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #15
Добавлено: 16.02.07 08:17
Уважаемый DimDoc!
Всегда пожалуйста!
(на этом обмен любезностями можно считать оконченным)