[CASIO 9850GB+] exacte getallen

Pagina: 1
Acties:

  • Arjan
  • Registratie: Juni 2001
  • Niet online

Arjan

copyright is wrong

Topicstarter
hallo,

ik was bezig om een programmatje te schrijven dat uit een kommagetal haar exacte equivalent kan halen. Gezien mijn beperkte kennis en de beperkte mogelijkheden op m'n rekenbak denk ik dat er niks anders opzit dan een soort trial and error methode.

de code is behoorlijk nasty, maar werkt in principe wel. Alleen schijnt de rekenbak 0.1666666667 en 0.1666666667 heeeeeeel verschillend van elkaar te vinden :(

dit had ik tot nog toe:
code:
1
2
3
4
5
6
7
8
9
10
1 -> Z
pi-1 -> W

input -> A
Label 0
(A/(U(pi-W)*(1/Z)))² -> B

IF (B=Int B)
THEN klaar
ELSE Z+1 -> Z


op middeleeuwse manier kijkt t programma dus of (1/iets)² gelijk is aan de input.
Na 50 keer proberen word de W gelijk aan 0, en dus word dan gekeken of X*pi(1/iets)² gelijk is aan de input.

de output is dan als volgt, gebruikende de variabelen uit het stukje pseudo code:

U * pi *1/Z * wortel B

als iemand hier wijs uit komt, dan kan die mij waarschijnlijk ook vertellen waarom als ik 1/6 invul, hij het correcte antwoord geeft en waarom hij, als ik 0.1666666667 invul, hij geen uitkomst heeft. Dit heeft volgens mij te maken met afrondingsfout. Dit probeerde ik op te lossen door het volgende stukje code te vervangen:

code:
1
2
3
IF (B=Int B)
THEN klaar
ELSE Z+1 -> Z
vervangen door
code:
1
2
3
IF (((Int (1e6 * B))/1e6)=Int B)
THEN klaar
ELSE Z+1 -> Z

waarbij 1e6 de nauwkeurigheid bepaald, hoe kleiner die waarde, hoe onnauwkeuriger.
de volledige code:
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
34
35
36
37
38
39
40
41
42
43
ClrText
1 -> V: 1 -> Z: 1 -> U
pi - 1 -> W
? -> A
Abs A -> A
Lbl 0
(A/(U(pi-W)*(1/Z)))² -> B
If ((Int (1e1B))/1e1)=Int B
Then Goto 1
Else Z+1 -> Z
IfEnd
If Z > 50 And pi-W=1
Then 0 -> W: 1 -> Z: 1 -> U
Goto 0
IfEnd
If Z>50
Then U+1 -> U
1 -> Z
IfEnd
If U = 10
Then ClrText
Locate 1,1,"Niet gevonden"
Stop
IfEnd
Goto 0
Lbl 1
ClrText
Locate 1,2,"Is gelijk aan:"
If 0 = W
Then Locate 1,3,V
Locate 2,3,"pi*"
V+3 -> V
IfEnd
If Z =/= 1
Then Locate V,3,"1(insert hier zon breuk teken)"
Locate V+2,3,Z
V+4 -> V
IfEnd
If B =/= 1
Then Locate V,3,"wortelteken"
Locate V+1,3,Int B
IfEnd
Locate 1,1,A


hij vind dan wel meestal een antwoord, maar echt vrolijk word ik daar niet van...

wie helpt mij ? :)

[ Voor 27% gewijzigd door Arjan op 25-06-2003 23:12 ]

oprecht vertrouwen wordt nooit geschaad


  • Opi
  • Registratie: Maart 2002
  • Niet online

Opi

Dit heeft idd te maken met een afrondingsfout. Ik weet niet hoeveel decimalen zo'n rekenunit opslaat, maar dit zijn er zo te zien meer dan er in het display staan. Tevens kunnen niet alle getallen als breuk geschreven worden, denk maar aan pi.

[Edit]
offtopic:
ff quote weggehaald :)

[ Voor 75% gewijzigd door Opi op 25-06-2003 22:56 ]


  • Arjan
  • Registratie: Juni 2001
  • Niet online

Arjan

copyright is wrong

Topicstarter
OpifexMaximus schreef op 25 June 2003 @ 22:55:
Dit heeft idd te maken met een afrondingsfout. Ik weet niet hoeveel decimalen zo'n rekenunit opslaat, maar dit zijn er zo te zien meer dan er in het display staan. Tevens kunnen niet alle getallen als breuk geschreven worden, denk maar aan pi.

[Edit]
offtopic:
ff quote weggehaald :)
beiden dingen die jij noemt had ik al rekening mee gehouden, in principe kun je de meeste getallen waar je mee te maken krijgt op de middelbare school wel uitdrukken in een breuk, wortel en pi.

In de volledige code zit nu de 1e6 ingesteld op 1e1, hierdoor vind ie de meeste getalen wel, maar heb je een ander probleem, namelijk het volgende:

Als je wortel 1500 ingeeft als getal, dus gewoon intypt, dan vind ie het volgende:
pi * 1/18 * wortel 49242
in principe klopt dat wel redelijk, maar als je als input wortel 1500 typt, dan vind ie dat direct...

De vraag is dus, hoe compenseer ik voor dit verschil ?

oprecht vertrouwen wordt nooit geschaad


  • Opi
  • Registratie: Maart 2002
  • Niet online

Opi

Volgens mij kan dit niet omdat, wanneer je het getal zelf intypt je al een afrondingsfout maakt die onbekend is. Volgens mij is de methode die je gebruikt, dus het antwoord vergelijken met de daadwerkelijke waarde, de enige manier.

  • Arjan
  • Registratie: Juni 2001
  • Niet online

Arjan

copyright is wrong

Topicstarter
OpifexMaximus schreef op 25 June 2003 @ 23:37:
Volgens mij kan dit niet omdat, wanneer je het getal zelf intypt je al een afrondingsfout maakt die onbekend is. Volgens mij is de methode die je gebruikt, dus het antwoord vergelijken met de daadwerkelijke waarde, de enige manier.
maar het idee is net dat je de daadwerkelijke waarde niet weet :)

het frustrerende is dat als je de afzonderlijke stappen die mijn progsel uitvoert in het run menu intypt, het geheel wel klopt :(
erg iritant

oprecht vertrouwen wordt nooit geschaad


  • Opi
  • Registratie: Maart 2002
  • Niet online

Opi

Atgast schreef op 25 June 2003 @ 23:56:
[...]
maar het idee is net dat je de daadwerkelijke waarde niet weet :)
Misschien kan je kijken met welke daadwerkelijke waarde de fout tussen de daadwerkelijke waarde en de waarde die jij invult (in dit geval de handmatige invoer van de wortel van 1500) geminimaliseerd wordt.
het frustrerende is dat als je de afzonderlijke stappen die mijn progsel uitvoert in het run menu intypt, het geheel wel klopt :(
erg iritant
Kan ik me heel goed voorstellen; maak je niet ergens een klein verschil, bijvoorbeeld bij de afronding van de beginwaarden?
Pagina: 1