Погрешность при суммировании... как победить?..

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Death666
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 17.12.2006 (Вс) 2:19
Откуда: Минск

Погрешность при суммировании... как победить?..

Сообщение Death666 » 28.12.2006 (Чт) 1:41

Есть такая проблема: во время работы цикла прирощение составляет, например, 0.2 на каждой итерации, ряд полученных по идее значений должен быть:
2; 2.2; 2.4; 2.6; 2.8; 3; 3.2; 3.4; 3.6; 3.8; 4.....

На деле почти всегда выходит примерно следующее6
2; 2.2; 2.4; 2.5999999; 2.799999; 2.99999; 3.19999....


Я думаю вы меня поняли... Это как-нибудь исправляется?

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 28.12.2006 (Чт) 2:04

Округлением до нужного знака и/или исправлением верхней границы цикла, если последняя итерация не происходит.
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 28.12.2006 (Чт) 2:04

Код в студию :)

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 28.12.2006 (Чт) 8:11

Есть подозрение, что код в соседнем топике. Там автор реализует цикл при помощи типа Single (а мож Double).
Весь мир матрица, а мы в нем потоки байтов!

Death666
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 17.12.2006 (Вс) 2:19
Откуда: Минск

Сообщение Death666 » 28.12.2006 (Чт) 13:45

!Viper! писал(а):Есть подозрение, что код в соседнем топике. Там автор реализует цикл при помощи типа Single (а мож Double).

А что, с помощью Single нельзя?

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 28.12.2006 (Чт) 14:46

Можно, но вот нужно ли... В специфике такого цикла ты уже убедился...
Весь мир матрица, а мы в нем потоки байтов!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 28.12.2006 (Чт) 14:54

Если очень хочется, попробуй использовать Currency.
Lasciate ogni speranza, voi ch'entrate.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 28.12.2006 (Чт) 15:04

Код: Выделить всё
Dim I as Long
Dim J as Single

FOR I=10 TO 100 STEP 2
     
    J=CSng(I/10)
    Debug.Print J

NEXT I


:wink:

Death666
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 17.12.2006 (Вс) 2:19
Откуда: Минск

Сообщение Death666 » 29.12.2006 (Пт) 2:33

Подскажите функцию округления до нужного знака?...

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 29.12.2006 (Пт) 2:51

Death666, тебе ее написал Konst_One :) (Умножить на 10 или 100, округлить, и опять разделить)
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 29.12.2006 (Пт) 8:06

А Round что отменили?
Весь мир матрица, а мы в нем потоки байтов!

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

Сообщение Debugger » 29.12.2006 (Пт) 10:46

Matew писал(а):Death666, тебе ее написал Konst_One :) (Умножить на 10 или 100, округлить, и опять разделить)

Код: Выделить всё

Dim i As Double
i=1,2344321
i=CDbl(CInt(i*100)/100)

Вроде того?

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 29.12.2006 (Пт) 14:00

А

Код: Выделить всё
Round(1.23458, 2)


не проще?
Весь мир матрица, а мы в нем потоки байтов!

Death666
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 17.12.2006 (Вс) 2:19
Откуда: Минск

Сообщение Death666 » 30.12.2006 (Сб) 0:28

!Viper!, всё работает ОК! Спасибо)


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

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

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

    TopList