Newsgroup: it.comp.lang.visual-basic
Titolo: calcoloni

come calcolereste 378344564434567376745 * 43767463768782767634
oppure 83847383293844765745 ^ 874343434756764654375 ?
ci sono dei metodi matematici?
oppure degli oggettini (che posso includere nel mio progetto)  che lo sanno
fare?
grazie.

 fare?
Il primo calcolo l'ho fatto fare ad una classe scritta da me.
Per ora fa solo moltiplicazioni a precisione arbitraria, ma non è detto che
le faccia bene :)
Anzi, se qualcuno vuole betatestarla, sono solo 160 righe di codice.
termoPilucco

 termoPilucco
Darkbyte@Home
-- 
Rivolterò il mondo per trovarlo, e anche se andasse in Indocina uno dei 
nostri starà nascosto in una ciotola di riso pronto a sparargli nel culo.
(Pulp Fiction)

 Anzi, se qualcuno vuole betatestarla, sono solo 160 righe di codice.
Mi interessa. Collaudo garantito e ... feroce.
Se non vuoi pubblicare qui, la mia mail valida la trovi ... cercando sul
SC...

Il 02/04/2004 9.12, KitesurfZ scrisse:

Ho provato con bc:
http://gnuwin32.sourceforge.net/packages/bc.htm
Ecco il risultato:
378344564434567376745 * 43767463768782767634
16559182016005824947980800128468270271330
83847383293844765745 ^ 874343434756764654375
Runtime error (func=(main), adr=46): exponent too large in raise
ciao
	maxx
-- 
NOSPAM: Rimuovere i trattini dallo username!
Cut hyphens from my username!

 874343434756764654375 credo sia impossibile.
il numero ottenuto non deve essere "contenuto" in niente, ma solo
visualizzato
tempo fa c'era un programmino nomato MUMATH che calcolava QUALSIASI
operazione. impiegava solo molto tempo, e poi "scrollava" per un bel pò
scopo? boh... curiosità... capire come si fa.

 Mi interessa. Collaudo garantito e ... feroce.
Ho uploadato qui:
http://www.unbelsito.com/vb/molt.zip
Note:
-L'algoritmo non č altro che la moltiplicazione che abbiamo imparato alle
scuole elementari.
-Il tutto č lento e non risparmia memoria in quanto si basa su stringhe.
Bisognerebbe basarsi su array o liste di long per fare qualcosa di piů
rapido e che sfrutti le moltiplicazioni e le somme di interi che vengono
eseguite in hardware dal processore.
-Aggiungere la somma/differenza č abbastanza banale.
-Per la divisione si potrebbe fare cosě: a/b equivale ad a*(1/b), quindi
"basta" calcolare il reciproco di un numero (possibili cifre periodiche,
quindi ci vorrebbe un limite).
termoPilucco

 scopo? boh... curiosità... capire come si fa.
non si fa :)
termoPilucco

 Ancora convinto che si possa calcolare esattamente? :P
se si ha tempo di guardare cifre scrollare.... ;-) se ci si anoia TANTO... e
si č MOOLTO longevi... si
grazie.

 
http://www.unbelsito.com/vb/molt.zip
Primo bug:
nel metodo "MoltiplicaPer" bisogna sostituire
If mntnum = 0 Or mantissa = 0 Then
con
If mntnum = "0" Or mantissa = "0" Then
termoPilucco, 'mo faccio l'upload

 Runtime error (func=(main), adr=46): exponent too large in raise
L'unico modo per trattrlo è lasciarlo in notazione esponenziale
83847383293844765745 ^ 874343434756764654375=
83847383293844765745 ^ 874343434756764654375
:)
termoPilucco

 :)
(5 * 3^2 * 1863275184307661461) ^ (466316498536941149 * 5^4 * 3)
Sono un po' lento nel calcolo dei numeri primi e quindi mi fermo qui ...
:-)


 ... :-)
Ho scritto un super algoritmo anch'io!
attenzione:
2^2=.................4!
in soli 13 secondi!! MITICO!! :))
ciaociao
P.S. scusate....è venerdì....

 in soli 13 secondi!! MITICO!! :))
Usi un braccio meccanico per premere i tasti?


[Lupo = 
circa_LupoOrm...@libero.it
 in
c4jo87$2iu1d2$
1...@ID-174464.news.uni-berlin.de
] ha scritto:

'Ho aggiunto un bottone (btn_rnd) e un ListBox (lst_rnd, abbastanza largo)
'e il codice che segue (nel quale ho cercato di tener conto dei limiti
'di VB per i numeri grandi). Complimenti a termoPilucco.
Private Sub btn_rnd_Click()
    Dim n1 As numero
    Dim n2 As numero
    Set n1 = New numero
    Set n2 = New numero
    Dim fatt1 As Double
    Dim fatt2 As Double
    Dim n As Long
    Dim ris_termo As String
    Dim ris_molt As Double
    Dim ris_molt_str As String
    Dim errore As Boolean
    Dim elenco_errori As String
    Randomize (Timer)
    lst_rnd.Clear
    elenco_errori = ""
    For n = 1 To 1000
        fatt1 = Fix(Rnd * 10 ^ 10) / 10 ^ 4
        fatt2 = Fix(Rnd * 10 ^ 10) / 10 ^ 2
        n1.FromString (Replace(Trim(Str(fatt1)), ".", ","))
        n2.FromString (Replace(Trim(Str(fatt2)), ".", ","))
        ris_termo = n1.MoltiplicaPer(n2).toString
        ris_molt = fatt1 * fatt2
        ris_molt_str = Replace(Trim(Str(ris_molt)), ".", ",")
        errore = 0
        If ris_molt_str <> ris_termo Then
            errore = 1
            If Len(ris_molt_str) <> Len(ris_termo) Then
                If InStr(ris_molt_str, ",") Then
                    If Left(ris_molt_str, Len(ris_molt_str) - 1) =
Left(ris_termo, Len(ris_molt_str) - 1) Then
                        errore = 0
                    End If
                Else
                    If CDbl(ris_molt_str) = Round(CDbl(ris_termo), 0) Then
                        errore = 0
                    End If
                End If
            End If
            If errore Then
                elenco_errori = elenco_errori & n & Space(1)
            End If
        End If
        lst_rnd.AddItem IIf(errore, "> ", "") & n & ": " & fatt1 & " * " &
fatt2 & " = " & ris_molt_str & " Termo: " & ris_termo
    Next n
    If elenco_errori <> "" Then
        MsgBox "Numeri errati: " & elenco_errori
    Else
        MsgBox "Tutto ok"
    End If
End Sub

'di VB per i numeri grandi). 
[...]
Non avevo pensato di collaudarlo con una procedura automatica :)
comunque, giusto per testare anche i numeri con segno negativo ho modificato due
righe dal tuo codice:
ovvero:
 fatt1 = Fix(Rnd * 10 ^ 10) / 10 ^ 4
 fatt2 = Fix(Rnd * 10 ^ 10) / 10 ^ 2
con:
 fatt1 = (-1) ^ (Int(Rnd * 2)) * Fix(Rnd * 10 ^ 10) / 10 ^ 4
 fatt2 = (-1) ^ (Int(Rnd * 2)) * Fix(Rnd * 10 ^ 10) / 10 ^ 2
termoPilucco