Toon posts:

[VB6]overflow bij grote getallen

Pagina: 1
Acties:
  • 292 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
kijk ik wil graag pi bereken, maar vb kan niet zulke grote getallen aan ik heb al het halve internet gezien maar
de oplossing nog niet gevonden hier is mijn programma code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Dim a
Dim b
Dim t
Dim x
Dim y
Dim pi
Dim z
Private Sub Form_Load()
a = 1
b = 1 / (2 ^ 0.5)
t = 0.25
x = 1
End Sub
Private Sub Command1_Click()
For z = 1 To 1000
y = a
a = (a + b) / 2
b = (b * y) ^ 0.5
t = t - x * (y - a) ^ 2
x = 2 * x
Next z
Label1.Caption = ((a + b) ^ 2) / (4 * t)

als ik For z = 1 to 10000 doe dan begint de elende

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 12-09 21:31

Janoz

Moderator Devschuur®

!litemod

Je kunt met floating point getallen gaan werken, deze hebben een groter bereik, maar wel een beperkte significantie.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Topicstarter
wat ik dus zoek is een manier om het op een miljoen
(of meer) decimalen te doen

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 17:08

mulder

ik spuug op het trottoir

Een double dan, maar gebruik F1 eens, dit is basic shit.

oogjes open, snaveltjes dicht


Verwijderd

Topicstarter
double heb ik ook al geprobeert maar daar schiet ik ook niet veel mee op

  • Mir
  • Registratie: Maart 2001
  • Niet online

Mir

dim z as double


integer = -32768 | 32768
Long = -2147483648 | 2147483647
Double = Decimale getllen met een nauwkeurigheid tot 7 plaatsen achter de komma

Currency :7 = - 922337203685477,5808 | 922337203685477,5807

hoop dat je er wat aan hebt...


[edit]
nu ik het zo eens bekijk declareer je ze gewoon als Variant...dus opzich moet het gewoon goed gaan...vreemd?

  • Mir
  • Registratie: Maart 2001
  • Niet online

Mir

BTW...code zo eens:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Dim a
Dim b
Dim t
Dim x
Dim y
Dim pi
Dim z

Private Sub Form_Load()
    a = 1
    b = 1 / (2 ^ 0.5)
    t = 0.25
    x = 1
End Sub

Private Sub Command1_Click()
    For z = 1 To 1000
      y = a
      a = (a + b) / 2
      b = (b * y) ^ 0.5
      t = t - x * (y - a) ^ 2
      x = 2 * x
    Next z
Label1.Caption = ((a + b) ^ 2) / (4 * t)

end sub '<------- ??

Ziet er wat netter en beter uit :)

Verwijderd

Topicstarter
hmmm, ik weet nog meer decimalen van pi uit me hoofd, waar ik aan dacht is, een array maken van een paar miljoen elementen, en dan in ieder element 1 decmaal achter de comma zetten, en dan zelf functies maken voor het optellen / aftrekken / vermenigvuldigen enz...ik weet dat zo'n module voor visual basic ergens wel te krijgen moet zijn, maar ik heb er al een uurtje of anderhalf naar gezocht, misschien weten de vb guru's hier wat meer over dit onderewerp....

  • Mir
  • Registratie: Maart 2001
  • Niet online

Mir

Op woensdag 20 februari 2002 23:59 schreef dev.null het volgende:
hmmm, ik weet nog meer decimalen van pi uit me hoofd, waar ik aan dacht is, een array maken van een paar miljoen elementen, en dan in ieder element 1 decmaal achter de comma zetten, en dan zelf functies maken voor het optellen / aftrekken / vermenigvuldigen enz...ik weet dat zo'n module voor visual basic ergens wel te krijgen moet zijn, maar ik heb er al een uurtje of anderhalf naar gezocht, misschien weten de vb guru's hier wat meer over dit onderewerp....
gewoon op bit niveau gaan rekennen lijkt mij?

valt opzich wel mee hoor...

Al snap ik niet wat je nou precies bedoeld; hoe kom je aan die waardes die je in je array gaat zetten dan!?

Verwijderd

Topicstarter
ik bedoel dus,(misschien ben ik wel gek, roep maar):
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
dim getal1(10000) as byte
dim getal2(10000) as byte
dim getal3(10000) as byte
dim dummy as byte
dim loop as integer

'getal1 = 123456 =>

getal1(0)=1
getal1(1)=2
getal1(2)=3
getal1(3)=4
getal1(4)=5
getal1(5)=6

'getal2 =102341

getal2(0)=1
getal2(1)=0
getal2(2)=2
getal2(3)=3
getal2(4)=4
getal2(5)=1

'en dan getal3 = getal1 + getal 2

for loop = 5 to 0 step -1
dummy = getal1(loop) +getal2(loop)
if dummy >9 then dummy=dummy=10:getal1(loop)=getal1(loop-1)
getal3(loop)=dummy
next loop

'de uitkomst staat dan in getal3()

zo duidelijker? of wordt het nu te complex (zelfs voor mij :p)

  • Mir
  • Registratie: Maart 2001
  • Niet online

Mir

Op donderdag 21 februari 2002 00:14 schreef dev.null het volgende:
ik bedoel dus,(misschien ben ik wel gek, roep maar):
code:
1
()

zo duidelijker? of wordt het nu te complex (zelfs voor mij :p)
ik snap je logica erachter eigenlijk niet echt :P

hiermee wil je PI gaan uitrekennen ofzo?
code:
1
dummy = dummy = 10 : getal1(loop)=getal1(loop-1)

??????
ten eerst waarom dummy = dummy = 10 ?
en waarom geen

if <statement> then
'doe
'doe2
{else}
end if

?

Verwijderd

Topicstarter
het probleem is dus dat ik hiermee ook getallen achter de comma moet kunnen berekenen, en kunnen delen en vermenigvuldigen....wat ik net liet zien is alleen maar optellen, maar ik dacht; misschien wordt het zo wat duidelijker, maar ik denk het niet dus....

die code is dus eigelijk alleen maar optellen, wat je in een functie kan zetten...

nu nog kwadraten en wortels enzo....

ik hoop dat je het zo snapt....

Verwijderd

Topicstarter
die dummy=dummy=10 moet dummy=dummy+10 zijn....

weet je wel, 5 + 6 = 11, maar dat kan niet, dus krijg je 1 carry....damn, boolean loggic :Z

  • Mir
  • Registratie: Maart 2001
  • Niet online

Mir

Op donderdag 21 februari 2002 00:21 schreef dev.null het volgende:
...
ik hoop dat je het zo snapt....
Hmmmmmm.....nope :7

maar verspil geen moeite :D

ik geef je wel een hint: schrijf je code wat netter!

  • Mir
  • Registratie: Maart 2001
  • Niet online

Mir

Op donderdag 21 februari 2002 00:24 schreef dev.null het volgende:
die dummy=dummy=10 moet dummy=dummy+10 zijn....

weet je wel, 5 + 6 = 11, maar dat kan niet, dus krijg je 1 carry....damn, boolean loggic :Z
afvangen >:)

  • NetForce1
  • Registratie: November 2001
  • Laatst online: 14:36

NetForce1

(inspiratie == 0) -> true

Je kunt ook de n-de decimaal van pi berekenen (weet ff niet hoe ;) ), en die kun je dat toch allemaal in een array zetten, of achter elkaar in een string gooien?

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


Verwijderd

Topicstarter
ja dat kan wel maar die metode is ontzettend traag (werkt met de fibonaci reeks volgens mij http://www.mcs.surrey.ac.uk/Personal/R.Knott/Fibonacci/fibpi.html)

Verwijderd

Het eerste wat je 'moet' aanleren is niet met variant variabelen te werken! VB heeft de rot gewoonte om bij variants (variabelen van een onbepaalde type) te kijken welke type het is, en dan de hele berekening volgens dat type te nemen. Indien niet alle variabelen van hetzelfde type zijn, moet je zelfs conversies doen met bijv. CDbl naar het type dat je uiteindelijk wilt overhouden!

Voorbeeldje:
code:
1
2
3
4
5
6
7
8
' Foute declaraties
dim A
dim B
dim C

A = 1000
B = 15000
C = A * B * 13.324


code:
1
2
3
4
5
6
7
8
' Alle variabelen zijn van hetzelfde type, geen fouten
dim A as Double
dim B as Double
dim C as Double

A = 1000
B = 15000
C = A * B * 13.324

Verwijderd

En het meest nauwkeurige variabele die je in VB kunt gebruiken is het Decimal subtype van Variant, zie Help voor meer info.

Verder snap ik van je verhaal heel weinig, maar raadt ik je ook niet aan om te proberen arrays te maken met miljoenen entries. Voor wat jij wil zou ik eens op zoek gaan naar wetenschappelijke rekenprogramma's!
Pagina: 1