Страница: 1 | 2 |
Вопрос: Динная арифметика
Добавлено: 21.07.07 20:55
Автор вопроса: ZagZag | ICQ: 295002202
lang: VB6.0
Есть ли у кого класс для работы с большими числами (динной арифметикой)?
Разрядность нужна в пределах 40цифр, но можно и больше.
Особое быстродействие не требуется. Приветствуется родной VB6.0 код =)
ЗЫ
Большинству форумчан уже известно что я в отпуске и трафф тут очень дорогой. Плз, будьте добры, не оставьте в беде. Я бы уже гуглей такой класс нашел (скорее вего =) ).
Просто подкиньте на мыло или, лучше, сюда код класса (можно незаархивленого)
Ответы
Всего ответов: 24
Номер ответа: 1
Автор ответа:
-АлександР-
Вопросов: 55
Ответов: 1008
Web-сайт:
Профиль | | #1
Добавлено: 22.07.07 12:28
Dim dbl As Double
dbl = 1 * 10 ^ 308 '???
End Sub
Номер ответа: 2
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #2
Добавлено: 22.07.07 13:39
Хех. -АлександР-, ты бы еще Currency предложил.
Извиняюсь, забыл про отсутствие плавающей точки упомянуть.
Надо: сложение/вычитание и сравнение чисел в 30-40 разрядов без плавающей точки.
Номер ответа: 3
Автор ответа:
-АлександР-
Вопросов: 55
Ответов: 1008
Web-сайт:
Профиль | | #3
Добавлено: 22.07.07 23:39
ZagZag, все равно чего-то не понимаю
берешь - и складываешь:
Private Sub Command1_Click()
Dim dbl As Double, dbl2 As Double
dbl = 1 * 10 ^ 308 '???
dbl2 = 10 ^ 30
dbl = dbl + dbl2
Command1.Caption = dbl
End Sub
без плавающей точки, 30 разрядов (даже 308 можно ), или может быть я что-то не то понимаю под "разрядом"?
Номер ответа: 4
Автор ответа:
shuffle
Администратор
ICQ: 201502381
Вопросов: 15
Ответов: 737
Профиль | | #4
Добавлено: 23.07.07 00:20
А ты закомменти строчку "dbl2 = 10 ^ 30" и посмотри, изменится ли результат
Диапазон допустимых значений у double большой, но количество значащих цифр после запятой не более 19.
Номер ответа: 5
Автор ответа:
EUGY
Вопросов: 0
Ответов: 454
Профиль | | #5
Добавлено: 23.07.07 00:21
-АлександР-
речь идет об этом:
Private Sub Command1_Click()
 im dbl As Double, dbl2 As Double
dbl = 10 ^ 16
dbl2 = dbl
dbl = dbl + 1 '!!!
Command1.Caption = "Сравнение двух double одно из которых больше другого на единицу " & (dbl = dbl2)
End Sub
Номер ответа: 6
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #6
Добавлено: 23.07.07 00:31
Мне точное значение надо. Абсолютно точное
Например:
62 ^ 20, но не 7,044e+35, а точно 70442342554699802296833026461637... (как там дальше, незнаю)
И так работать с различными числами.
Что ж, пишу класс сам. Операция сравнения уже готова
Номер ответа: 7
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #7
Добавлено: 23.07.07 00:38
clsLongMath.cls
'Автор: ZagZag (zagzag@xaker.ru, icq: 295002202)
Public Var1 As String
Public Var2 As String
Public Function Cmp() As Long
'Описание: Функция сравнения Var1 и Var2
'Результат: -1 - Var1>Var2, 0 - Var1=Var2, 1 - Var1<Var2
Dim lngLen1 As Long, lngLen2 As Long
lngLen1 = Len(Var1)
lngLen2 = Len(Var2)
If lngLen1 > lngLen2 Then
Cmp = -1
Exit Function
ElseIf lngLen1 < lngLen2 Then
Cmp = 1
Exit Function
End If
For lngLen2 = 1 To lngLen1
If Asc(Mid$(Var1, lngLen2, 1)) <> Asc(Mid$(Var2, lngLen2, 1)) Then
If Asc(Mid$(Var1, lngLen2, 1)) > Asc(Mid$(Var2, lngLen2, 1)) Then
Cmp = -1
Else
Cmp = 1
End If
Exit Function
End If
Next
Cmp = 0
End Function
Public Function Exp() As String
'Описание: Функция возведения Var1 в степень Var2
'Результат: Var1^Var2
End Function
Public Function Subt() As String
'Описание: Функция вычитания Var2 из Var1
'Результат: Var1-Var2
End Function
Public Function Sum() As String
'Описание: Функция сложения Var1 и Var2
'Результат: Var1+Var2
End Function
Номер ответа: 8
Автор ответа:
-АлександР-
Вопросов: 55
Ответов: 1008
Web-сайт:
Профиль | | #8
Добавлено: 23.07.07 01:02
<=Alex=>
Dim dbl2 As Double
dbl2 = 0.01 ^ 30
Command1.Caption = dbl2
End Sub
EUGY, ZagZag
ясно, понял, сразу не сообразил, сорри
ZagZag, и как это работает?
Номер ответа: 9
Автор ответа:
EUGY
Вопросов: 0
Ответов: 454
Профиль | | #9
Добавлено: 23.07.07 01:06
to ZagZag
Совсем необязательно проверять посимвольно.
...
If (Var2 = Var1) Then
Cmp = 0
ElseIf Var2 > Var1 Then
Cmp = 1
Else
Cmp = -1
End If
Номер ответа: 10
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #10
Добавлено: 23.07.07 01:44
EUGY, не катит =(
Option Compare Text
Private Sub Form_Load()
Dim A As String, B As String
A = "38547835673567356"
B = "9567567957"
MsgBox A > B
End Sub
Номер ответа: 11
Автор ответа:
shuffle
Администратор
ICQ: 201502381
Вопросов: 15
Ответов: 737
Профиль | | #11
Добавлено: 23.07.07 01:54
Dim dbl2 As Double
dbl2 = 0.01 ^ 30
Command1.Caption = dbl2
End Sub
Измени код, например, на такой:
Dim dbl2 As Double
dbl2 = 0.01 ^ 30
dbl2 = dbl2 + 0.02
Command1.Caption = dbl2
End Sub
Что он должен вывести? 0.0200000...01, а выводит 0.02, потому что не хранит он в памяти все это число.
И вообще, как ты в 8 байт (размер double) хочешь поместить 10^208 разных значений?
Номер ответа: 12
Автор ответа:
shuffle
Администратор
ICQ: 201502381
Вопросов: 15
Ответов: 737
Профиль | | #12
Добавлено: 23.07.07 01:59
Поскольку у тебя нет дробных чисел, то число, запись которого длинее (больше цифр), больше другого. В противном случае посимвольно проверять каждую цифру справа до тех пор, пока не найдешь две разные цифры.
Номер ответа: 13
Автор ответа:
-АлександР-
Вопросов: 55
Ответов: 1008
Web-сайт:
Профиль | | #13
Добавлено: 23.07.07 02:03
Номер ответа: 14
Автор ответа:
EUGY
Вопросов: 0
Ответов: 454
Профиль | | #14
Добавлено: 23.07.07 02:14
ZazZag,катит
Private Sub Command1_Click()
Dim A As String, B As String
A = "38547835673567356"
B = "567567957"
B = Space(Len - Len(B)) & B
MsgBox A > B
End Sub
Номер ответа: 15
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #15
Добавлено: 23.07.07 08:45
Посмотри GMP