Проблема с Single

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

Проблема с Single

Сообщение GM » 03.11.2004 (Ср) 8:32

Вообщем наткнулся на вот такую ошибку в проге:
Код: Выделить всё
Dim x As Single
Dim i As Integer
x = 10.7
Call MsgBox("Результат #1:  10.7 - (0.1 *10) = " & _
            CStr(x) & "-" & CStr((0.1 * 10)) & " = " & _
            CStr(x - (0.1 * 10)))
Call MsgBox("Результат #2:  10.7 - csng((0.1 * 10)) = " & _
            CStr(x) & "-" & CSng((0.1 * 10)) & " = " & _
            CStr(x - CSng((0.1 * 10))))
For i = 1 To 10
x = x - 0.1
Next
Call MsgBox("Результат #3:" & x)

Все функции должны возращать один и той же результат, но вместо этого
1.9,69999980926514
2.9,7
3.9,699996
Правильным оказался лиш второй вариант. Почему :?:
الفيجوال بيسك الرابح

timsoft
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 181
Зарегистрирован: 18.10.2003 (Сб) 10:50
Откуда: Odessa, Ukraine

Сообщение timsoft » 03.11.2004 (Ср) 10:48

Интересно, что если x as double то все три результата одинаковы :roll:

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 03.11.2004 (Ср) 11:16

Ммм. Пошукай в свойствах проекта, в разделе оптимизации, такую галку - Allow Unrounded Floating Point Operations. Она должна быть снята. Ну и насчет перевода в Double, тоже интересный вариант...

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

Сообщение alibek » 03.11.2004 (Ср) 11:19

Используй числа с фиксированной запятой (Currency или Integer/Long с умножением на коэффициент и последующим делением на коэффициент).
Lasciate ogni speranza, voi ch'entrate.

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 04.11.2004 (Чт) 7:48

Alibek писал(а): умножением на коэффициент и последующим делением на коэффициент

Я так сразу и сделал, просто хотел узнать почему так происходит.
А вот и Double:
Код: Выделить всё
Dim x As Double
Dim i As Integer
x = 10.7
Call MsgBox("Результат #1:  100.7 - (0.1 *100) = " & _
            CStr(x) & "-" & CStr((0.1 * 100)) & " = " & _
            CStr(x - (0.1 * 100)))
Call MsgBox("Результат #2:  10.7 - cDbl((0.1 * 100)) = " & _
            CStr(x) & "-" & CDbl((0.1 * 100)) & " = " & _
            CStr(x - CDbl((0.1 * 100))))
Call MsgBox("Результат #3:  10.7 - csng((0.1 * 100)) = " & _
            CStr(x) & "-" & CSng((0.1 * 100)) & " = " & _
            CStr(x - CSng((0.1 * 100))))
For i = 1 To 100
x = x - 0.1
Next
Call MsgBox("Результат #4:" & x)

1.0,699999999999999
2.0,699999999999999
3.0,699999999999999
4.0.70000000000002
الفيجوال بيسك الرابح

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

Сообщение alibek » 04.11.2004 (Чт) 10:29

GM, ты информатику изучал? Знаешь, как кодируются десятичные вещественные числа двоичным кодом?
То, что ты видишь, это ошибки округления. Такие ошибки есть на любом калькуляторе, просто на калькуляторе есть один запасной разряд, который невидим (т.е. если на экране отображается 9 цифр, то калькулятор оперирует с 10 цифрами), а когда показывает на дисплее результат, показывает его с округлением до отображаемой разрядности. Округли 0.699999999999999 (всего 15 знаков после запятой) до 14-го знака после запятой, получишь 0.7.

З.Ы. Хорошие инженерные калькуляторы имеют не один, а два скрытых разряда. Поэтому они успешно "переносят" даже многократные операции вида "корень из трех возвести в квадрат, снова взять корень, опять возвести в квадрат...".
Lasciate ogni speranza, voi ch'entrate.


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

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

Сейчас этот форум просматривают: The trick и гости: 3

    TopList  
cron