Jag håller på att räkna ut följande mattetal med datorn: <code> Det stämmer bra det! Long är alldeles för liten för att klara av det där klassiska beräkningsexemplet (som sägs vara det pris som någon en gång i tiden ville ha för sin uppfinning: schackspelet, nämligen just det antalet riskorn). En kort kommentar till ovanstående:för stort tal
Du målar ett schackbräde, för den första rutan får du 1 kr,
andra 2 kr, tredje 4, fjärde 8 osv. Hur mycket pengar har du
när du målat klart schakbrädet (som består av 64 rutor)
formeln är:
x = 2^64 - 1
men om jag vill veta svaret... jag kör följande kod i vb:
Dim tot As Long, x As Long
x = 1
For a = 1 To 64
tot = tot + x
x = x * 2
Next a
(tot = svaret)
men long klarar inte av att hantera sådana här stora
variabler. Kan man dimensionera de på ett annat sätt, eller hur ska
jag göra? (jag får overflow redan vid ruta 31)
mvh
JohnSv: för stort tal
Dim tot, x
x = 1
For a = 1 To 64
tot = tot + x
x = x * 2
Next a
CSng(tot)
</code>Sv: för stort tal
Double klarar bara av att hantera tal upp till 2 147 483 647, alltså några futtiga 2 mijarder bara! *ler*
En annan variabeltyp i VB som klarar större tal med max fyra decimaler är Currency, men även denna räcker inte till här, Currency klarar nämligen enbart av tal upp till 922 337 203 685 477,5807.
VAD skall man då ta sig till!? ETT sätt vore kanske att göra en egen miniräknare som manuellt beräknar var och en av siffrorna och lagrar dem siffra för siffra i en array eller nå't - att räkna ut det rätta svaret skulle dock ta VÄLDIGT lång tid (och programmet skulle va jobbigt att skriva - ännu värre för en programmerare!).
Det finns dock variabeltyper i VB som klarar så här enormt stora tal, nämligen Single och Double. Dessa avrundar dock antal decimaler och presenterar svaret som en tiopotens.
Du BEHÖVER inte göra en loop för att räkna med potenser i VB:
<code>
Dim x As Single
x = 2 ^ 64 - 1
MsgBox "Svaret är " & x
</code>
Du kan även beräkna det utan variabeldeklarationer:
<code>
MsgBox 2 ^ 64 - 1
</code>
Nyfiken på vad svaret blir?! :-)
Kan avslöja att den sista koden resulterar i följande resultat: 1,84467440737096E+19
Detta är samma sak som:
18 446 744 073 709 600 000
Observera att detta svar är något avrundat! Kan väl tillägga att det där är mer riskorn än vad som finns på hela jorden. Som en ytterligare parantes så kan man då fråga sig vad ett japanskt schack-spel (kallas 'Shogi') skulle kosta... det har nämligen nio x nio rutor!!! De har även en äldre variant som har upp till 25 rutor per sida (Tai Shogi)!!! Denna variant är nästan ospelbar, varje sida har till skillnad från schackspelets 16 pjäser hela 177 pjäser!!!).
Nedladdningsbart program som spelar Shogi:
http://www.netspace.net.au/~trout/
Lycka till med beräkningarna!!
//QezlotSv: för stort tal
* Det är datatypen long som klarar tal upp till 2,14 miljarder, en singel klarar 3,4*10^38 och en double klarar upp till 1,8*10^308
* Man skall i möjligaste mån inte använda ^-upphöjt operatorn, den är VÄLDIGT långsam, använder man en loop istället så är det ungefär 20 ggr snabbare.
//Tord