Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Stora tal i visual basic

Postades av 2005-05-11 21:30:37 - Mattias Frisk, i forum visual basic - allmänt, Tråden har 13 Kommentarer och lästs av 2078 personer

Hur kan jag räkna ut stora tal såsom 10^100 i vb utan att få Overflow?


Svara

Sv: Stora tal i visual basic

Postades av 2005-05-11 21:57:25 - Peter Holm

dim a as double
a=10^100


A double-precision floating-point value with a range of  – 1.79769313486232E308 to  – 4.94065645841247E-324 for negative values, 4.94065645841247E-324 to 1.79769313486232E308 for positive values, and 0.


[Peter.H]


Svara

Sv:Stora tal i visual basic

Postades av 2005-05-11 22:07:34 - Mattias Frisk

Usch blev ju med 1E+100 jag vill ha det i endast siffror :/


Svara

Sv: Stora tal i visual basic

Postades av 2005-05-11 22:59:34 - Niklas Jansson

Det "enklaste" är troligtvis att göra egna funktioner som använder sig av strängar.
Rimligare är att leta efter något bibliotek som kan lösa det åt dig.


Svara

Sv: Stora tal i visual basic

Postades av 2005-05-12 14:30:32 - Per Hultqvist

<code>
MsgBox "1" & String(100, "0")
</code>

Nä, skämt åsido. Jag har en klass som kan räkna (well, plus och minus, samt potenser, men ej multplikation och division) men den är skriven i C#.

Jag gjorde helt enkelt en klass som innehöll en array av Long. Sedan utför jag beräkningarna precis som när man räknar på papper, men med ett long i taget. Varje long innehåller ett antal positioner av det stora talet, lämpligen hälften av vad datatypen klarar av (för att multiplikationer skall klaras av utan overflow)

Trivialt exempel där vi räknar med att varje long innehåller två siffror dvs mellan 0 och 99. Talet 1234 blir då alltså en array med två long som båda innehåller talet 22. Multiplicerar vi detta med 39 så får vi (om vi börjar från höger):
<info>
34
* 39
----
1326
</info>
Produkten 1234*39 slutar alltså med siffrorna 26. 13 måste vi föra över som rest till nästa multiplikation :
<info>
12
* 39
----
468
+ 13 (rest från förra multiplikationen)
----
481
</info>
Eftersom 481 är större än 100 får vi dela även detta i två delar så resultatet blir en array med tre long : 4, 84 och 26. 1234*39 är alltså 48126.

Det blir givetvis lite mer komplicerat när båda talen är större än 99, men det kan du nog lista ut. Addition och subtraktion är betydligt enklare.

Eftersom du använder VB6 så är 32-bitars long den bästa datatypen, och den klarar 9 siffror totalt (ja 10 siffror men bara upp till drygt 2 miljarder), så eftersom du måste kunna utföra multiplikationer utan overflow så får du använda 4 positioner, dvs tal mellan 0 och 9999 i varje position. För ett hundrasiffrigt tal behöver du alltså en array på 25 longs.

Så skulle jag löst det...nyfiken dock på Niklas förslag med strängar?


Svara

Sv:Stora tal i visual basic

Postades av 2005-05-12 20:22:11 - Niklas Jansson

Ja, det är ju precis samma metod, fast med strängar istället.
Det blir troligtvis aningen segare med strängar men å andra sidan tycker jag att de är enklare att hantera.


Svara

Sv: Stora tal i visual basic

Postades av 2005-05-13 10:08:44 - Per Hultqvist

Ah ok, ja det kan nog tänkas att det skulle bli enklare att hantera det. Man slipper ju array-hanteringen...


Svara

Sv: Stora tal i visual basic

Postades av 2005-05-13 14:18:47 - Niklas Jansson

Jag kan ge ett kort exempel på hur man skulle kunna göra exempelvis en additionsrutin:
Man förväntar sig att a och b båda är talen skrivna baklänges.

Public Function StringAdd (a As String, b As String) As String
Dim Pos As Long, MaxPos As Long, Result As String, Sum as long, minne as long
MaxPos=Max(Len(a), Len(b))
Result =String$(MaxPos, "0")

minne=0
For Pos= 1 to maxpos
Sum=Asc(Mid$(a, pos, 1))+Asc(Mid$(b, pos,1))+minne
Minne=sum \ 10
Mid$(Result, pos, 1)=sum mod 10
Next Pos
Result=Result & minne
StringAdd = Result
End Function

Något i den stilen. Sen måste man ha kontroller för när ena strängen tar slut, se till att strängarna inte har massa nollor, osv.


Svara

Sv:Stora tal i visual basic

Postades av 2005-05-15 09:02:43 - Peter Holm

Eller så använder man en rekursiv funktion. Jag älskar rekursiva funktioner, ni som vart med sen
längre tillbaka känner till detta. Jag presenterar här min rekursiva strAddRek funktion som klarar
att addera två tal i strängform. Den har dock brister. Denna version klarar endast positiva tal.

Med rekursiva funktioner får man ofta enkla, snygga samt lättbegripliga lösningar.

Det kan vara krångligt för nybörjaren att förstå hur det fungerar. Men i princip kan man säga att
det handlar om "Divide et impera" (Söndra och härska). Man bryter ner problemet i småproblem.

I detta fall, vad innebär det att addera två jättelånga tal. Jo att addera ett och ett tal tills hela talet
är adderat. Precis så gör den rekursiva funktionen. Adderar tal för tal tills det blir färdigt. Jamen
säger du, det gör ju loopen med. Japp alldeles riktigt. Men en loop-koden är inte lika lätt att sätta
sig in i och förstå principen av.

Koden går naturligtvis att krympa ner, men då blir den otydlig och krånglig att förstå... jag har valt att använda så här många lokala variabler och så för att göra det mer tydligt. jmfr. med loop-kodens rad:

<code>
Sum=Asc(Mid$(a, pos, 1))+Asc(Mid$(b, pos,1))+minne
</code>

Kanske inte exakt solklart vad som händer ;) ;)

Nåja. Jag kommer nog få massa respons nu på detta inlägg :D det är skoj. Men nu ska jag visa koden
för den rekursiva varianten.



<code>
Option Explicit

Private Function strAddRek(parts As Variant) As String
Dim term1 As Integer
Dim term2 As Integer
Dim delsumma As String
Dim tmp As String
Dim minne As String

If parts(0) <> "" Or parts(1) <> "" Or parts(2) <> "" Then 'Stoppvilkor
parts(0) = IIf(parts(0) = "", "0", parts(0)) '0-utfyllnad vid behov
parts(1) = IIf(parts(1) = "", "0", parts(1)) '0-utfyllnad vid behov
term1 = CInt(Right(parts(0), 1)) '1:a termen
term2 = CInt(Right(parts(1), 1)) '2:a termen
minne = Val(parts(2)) 'Minne från föregående addition
tmp = Format(term1 + term2 + minne, "0") 'Summera
delsumma = Right(tmp, 1) 'Ta ut delsumma ental
parts(3) = delsumma & parts(3) 'Lägg till delsumman till totalsumman
parts(0) = Left(parts(0), Len(parts(0)) - 1) 'Återstoden av term1 som ska beräknas
parts(1) = Left(parts(1), Len(parts(1)) - 1) 'Återstoden av term2 som ska beräknas
parts(2) = Left(tmp, Len(tmp) - 1) 'Minne till nästa addition.
strAddRek = strAddRek(parts) 'Anropa nästa addition rekursivt
Else
strAddRek = parts(3) 'Stoppvilkor uppfyllt, returnera svar
End If
End Function

Private Sub Command1_Click()
Dim a As Variant
ReDim a(3)
a(0) = "98273540970598732098734508972340897346897457609235876345"
a(1) = "98345698230983254689054089756763456234564569836089746897246"
a(2) = "0"
a(3) = ""
MsgBox strAddRek(a)
End Sub

</code>


[Peter.H]


Svara

Sv: Stora tal i visual basic

Postades av 2005-05-15 20:01:03 - Niklas Jansson

Men koden är ju såpass basic att jag nog tycker att det är tillräckligt enkelt för att inte skriva om det till en rekursiv grej. Personligen tycker jag inte att en rekursiv variant är snyggare i detta fallet, och ärligt talat tror jag att min är lättare att förstå.


Svara

Sv:Stora tal i visual basic

Postades av 2005-05-15 20:24:41 - Peter Holm

Visst är det en viss tröskel att kliva över innan man fattar konceptet rekursiva funktioner.

Ofta löser man problemen lika enkelt med loopar som med rekursiva funktioner. Ibland
är en rekursiv lösning rent utav sämre. Det är en smaksak. Jag använder gärna rekursiva
funktioner om jag kan och det medger en snyggare lösning.

I detta fallet är det som du säger kanske varken snyggare eller enklare kanske...

Men håll med om att i sina sammanhang är dom kraftfulla och snygga. Det är som poesi
eller konst ;)

[Peter.H]


Svara

Sv: Stora tal i visual basic

Postades av 2005-05-16 07:22:59 - Mattias Frisk

Tjo igen,

Jag tycker nog niklas lösning var den enklaste men tack för hjälpen alla :)


Svara

Sv: Stora tal i visual basic

Postades av 2005-05-16 10:19:47 - Niklas Jansson

<b>>Men håll med om att i sina sammanhang är dom kraftfulla och snygga. Det är som poesi
eller konst ;)</b>
Jo, är ett problem definierat på ett rekursivt sätt är de rekursiva lösningarna i allmänhet snygga. Sen ska man tänka på att i tidskritiska grejer så kräver rekrusion en del overhead i både minne och fart.


Svara

Sv:Stora tal i visual basic

Postades av 2005-05-16 10:35:47 - Per Persson

Vissa problem kan inte lösas utan rekursion (om man inte använder en stack för att simulera rekursion).

Vid s k svansrekursion kan koden skrivas om till en loop (av kompilatorn). Sådan är dock inte alltid tillämpbar.


Svara

Nyligen

  • 09:09 Vill du köpa medicinska tester?
  • 12:47 Vem beviljar assistansen – kommune
  • 14:17 Någon med erfarenhet av hemstädnin
  • 14:14 Bör man använda sig av en båtförme
  • 14:12 Finns det någon intressant hundblo
  • 14:25 Tips på verktyg för att skapa QR-k
  • 14:23 Tips på verktyg för att skapa QR-k
  • 20:52 Fungerer innskuddsbonuser egentlig

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 569 166
27 952
271 704
1 634
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies