Странный Overflow

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

Странный Overflow

Сообщение --=GAMER=-- » 30.07.2006 (Вс) 10:30

Есть простой код с формулой:

Код: Выделить всё
Dim a,b,c,d as Double

a=1000
b=1.5
c=10

d = (a*(1-b^c))/(1-b) 'Здесь происходит Overflow


Однако Если заменить b на величину большую 2, Overflow Исчезает.
Совсем странно, если просто расписать:

Код: Выделить всё
d=(1000(1-1.5^10))/(1-1.5)


Overflow тоже исчезает.
Помогите разобраться.
В темноте слепец — самый надежный проводник. В эпоху безумия пусть тебя ведет сумасшедший.

rRenderer Engine
VB Wiki

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 30.07.2006 (Вс) 11:11

d=(1000(1-1.5^10))/(1-1.5) ???
Без умножения????
Может так:
d=(1000*(1-1.5^10))/(1-1.5)
У меня чатенько бывают такие глюки но с чтением переменных из файла...
#define ROFL 0xDDDD

--=GAMER=--
Фиолетовый бот
Фиолетовый бот
Аватара пользователя
 
Сообщения: 810
Зарегистрирован: 22.03.2004 (Пн) 11:29
Откуда: Владивосток

Сообщение --=GAMER=-- » 30.07.2006 (Вс) 11:21

Тьфу, естественно d=(1000*(1-1.5^10))/(1-1.5). Но ошибся я именно тут, в коде я умножение не забыл. Четния из файла не происходит, код примитивен до невозможности.
В темноте слепец — самый надежный проводник. В эпоху безумия пусть тебя ведет сумасшедший.

rRenderer Engine
VB Wiki

IIIypuk
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 10.06.2006 (Сб) 12:39

Сообщение IIIypuk » 30.07.2006 (Вс) 11:23

У тебя a, b и с переменные типа вариант. Потому при присвоении a и с, как я понимаю, они конвертируются в integer.

ну а потом обычная ошибка оверфлова, напр.:

Код: Выделить всё
Dim a As Integer
Dim b As Integer
Dim c As Long

   a = 10000
   b = 10000
   c = a * b


А надо бы

c = CLng(a) * b

Мне кажется ошибка в этом.

Если обозначить
Dim a As Double, b As Double, c As Double, d As Double
то никакой ошибки нет.
Есть 10 типов людей. Те, кто понимает двоичную систему исчисления, и те, кто не понимает...

--=GAMER=--
Фиолетовый бот
Фиолетовый бот
Аватара пользователя
 
Сообщения: 810
Зарегистрирован: 22.03.2004 (Пн) 11:29
Откуда: Владивосток

Сообщение --=GAMER=-- » 30.07.2006 (Вс) 11:31

Неа. Проверил, всё равно Overflow. И главное ставим b=2.5 - оверфлоа нет, ставим b=1.5 - оверфлоу.....
В темноте слепец — самый надежный проводник. В эпоху безумия пусть тебя ведет сумасшедший.

rRenderer Engine
VB Wiki

IIIypuk
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 10.06.2006 (Сб) 12:39

Сообщение IIIypuk » 30.07.2006 (Вс) 11:32

Скинь сам проект. Я счас проверил, и по первоначальному коду нет overflova

Может у тебя в проекте где перекрывается переменная?

З.Ы. А обозначать надо все же
Dim a As Double, b As Double, c As Double

Потому как код
Dim a, b, c As Double
a = "string"

прекрасно работает.
Есть 10 типов людей. Те, кто понимает двоичную систему исчисления, и те, кто не понимает...

--=GAMER=--
Фиолетовый бот
Фиолетовый бот
Аватара пользователя
 
Сообщения: 810
Зарегистрирован: 22.03.2004 (Пн) 11:29
Откуда: Владивосток

Сообщение --=GAMER=-- » 30.07.2006 (Вс) 11:41

ВотЪ.
Вложения
Test.rar
ВотЪ.
(1.09 Кб) Скачиваний: 35
В темноте слепец — самый надежный проводник. В эпоху безумия пусть тебя ведет сумасшедший.

rRenderer Engine
VB Wiki

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 30.07.2006 (Вс) 11:45

--=GAMER=--
Гы... Ошибка очень глупая... Ты просто не внимательный
Замени этот код:
Private Sub Command1_Click()
a = Int(Text1.Text)
b = Int(Text2.Text)
c = Int(Text3.Text)
d = Int((a * (1 - b ^ c)) / (1 - b))
q = MsgBox(d, vbInformation, "Ðåçóëüòàò")
End Sub
На вот этот
Dim a As Double, b As Double, c As Double, d As Double
Private Sub Command1_Click()
a = CDbl(Text1.Text)
b = CDbl(Text2.Text)
c = CDbl(Text3.Text)
d = Int((a * (1 - b ^ c)) / (1 - b))
q = MsgBox(d, vbInformation, "Ðåçóëüòàò")
End Sub
У меня так работает! Внимание! делал 34 сек.
:wink:
#define ROFL 0xDDDD

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 30.07.2006 (Вс) 11:46

У тебя из Double конвертится в Integer и происходит overflow! :)
#define ROFL 0xDDDD

--=GAMER=--
Фиолетовый бот
Фиолетовый бот
Аватара пользователя
 
Сообщения: 810
Зарегистрирован: 22.03.2004 (Пн) 11:29
Откуда: Владивосток

Сообщение --=GAMER=-- » 30.07.2006 (Вс) 11:51

Всё, спасибо, как всегда из-за невнимательности...
В темноте слепец — самый надежный проводник. В эпоху безумия пусть тебя ведет сумасшедший.

rRenderer Engine
VB Wiki

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 30.07.2006 (Вс) 12:08

--=GAMER=--
Незачто!
#define ROFL 0xDDDD

Sacred Phoenix
Начинающий
Начинающий
 
Сообщения: 22
Зарегистрирован: 22.07.2006 (Сб) 18:20

Сообщение Sacred Phoenix » 30.07.2006 (Вс) 14:23

Прошу прощения за оффтоп.

IIIypuk писал(а):Dim a, b, c As Double
a = "string"

прекрасно работает.

а ты в курсе, что у тебя переменные a и b объявлены As Variant?

ЗЫ. Это же касается и --=GAMER=--, ибо в коде, приведённом в первом посте, переменные a, b и c объявляются вариантными, а при присвоении им той же 1000, тип меняется на Variant/Integer (по-моему).

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 30.07.2006 (Вс) 14:36

IIIypuk в курсе, потому что он сам про это написал в своём первом ответе.
Phoenix, твои последние посты -- флуд и оффтоп. Такое не приветствуется.
Изображение


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 80

    TopList