Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 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-сайт: barsik.newmail.ru
 Профиль | | #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
А еще можно в нужный момент для верности просто округлить
Number = Round(Number)

Ответить

Номер ответа: 10
Автор ответа:
 DimDoc



Вопросов: 21
Ответов: 104
 Профиль | | #10 Добавлено: 14.02.07 22:38
Спасибо большое FEVER.
Просто и доходчиво.
Если кого обидел - простите!
Математику 25 лет назад в школе учил.
И сейчас с ней не связан по профессии.
Конечно, если напрячься - всё изучить можно.
тогда и форум, наверное не нужен будет...

и последнее...
если переменную объявить как Currency - ошибка тоже не появляется. можно ли так поступить?

Ответить

Номер ответа: 11
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #11 Добавлено: 15.02.07 11:04
Хто на кого похож ты на EROSа или он на тебя ?

А при чем тут, собственно, 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!
Всегда пожалуйста!
:-)
(на этом обмен любезностями можно считать оконченным)

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам