Visual Basic, .NET, ASP, VBScript
 

   
   
     

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

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

 

  Вопрос: Динная арифметика Добавлено: 21.07.07 20:55  

Автор вопроса:  ZagZag | ICQ: 295002202 
lang: VB6.0
Есть ли у кого класс для работы с большими числами (динной арифметикой)?
Разрядность нужна в пределах 40цифр, но можно и больше.
Особое быстродействие не требуется. Приветствуется родной VB6.0 код =)

ЗЫ
Большинству форумчан уже известно что я в отпуске и трафф тут очень дорогой. Плз, будьте добры, не оставьте в беде. Я бы уже гуглей такой класс нашел (скорее вего =) ).
Просто подкиньте на мыло или, лучше, сюда код класса (можно незаархивленого)

Ответить

  Ответы Всего ответов: 24  

Номер ответа: 1
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #1
Добавлено: 22.07.07 12:28
Private Sub Command1_Click()
    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-сайт: sham.clan.su
 Профиль | | #3
Добавлено: 22.07.07 23:39
ZagZag, все равно чего-то не понимаю :-[

берешь - и складываешь:


Option Explicit
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 можно :-D), или может быть я что-то не то понимаю под "разрядом"?

Ответить

Номер ответа: 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()
    ;Dim 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-сайт: sham.clan.su
 Профиль | | #8
Добавлено: 23.07.07 01:02
<=Alex=>
Диапазон допустимых значений у double большой, но количество значащих цифр после запятой не более 19.
как тогда понять это:

Private Sub Command1_Click()
    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 Explicit
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
как тогда понять это:
Private Sub Command1_Click()
    Dim dbl2 As Double
    dbl2 = 0.01 ^ 30
    Command1.Caption = dbl2
End Sub

Измени код, например, на такой:
Private Sub Command1_Click()
    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-сайт: sham.clan.su
 Профиль | | #13
Добавлено: 23.07.07 02:03
И вообще, как ты в 8 байт (размер double) хочешь поместить 10^208 разных значений?
гм, а я то голову ломал, когда типы данных изчал..., так и не придумал..., эк умный Билли

Ответить

Номер ответа: 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(A) - Len(B)) & B
    MsgBox A > B
End Sub

Ответить

Номер ответа: 15
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #15
Добавлено: 23.07.07 08:45
Посмотри GMP

Ответить

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

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



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