Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[Scheme R5RS] Raar afrondingsissue

Pagina: 1
Acties:

  • st0p
  • Registratie: April 2004
  • Laatst online: 19-07-2024
Ik ben met wat project euler problemen bezig en bij nummer 20 kom ik een raar afrondings issue tegen:

code:
1
2
3
4
5
6
(define (digits x) (floor (/ (log x) (log 10))))

(define (firstnum x) 
  (floor (/ x (expt 10 (digits x)))))

(define (removefirst x) (ceiling (- x (* (firstnum x) (expt 10 (digits x))))))


Nee, dit is geen fraaie code maar ik ben nog een beginner met scheme (Lees: nog geen week mee bezig) en zeker geen held met wiskunde.

Anyway, als ik de volgende code aanroep:
code:
1
(firstnum (removefirst 64000000000000000000000000))


Dan zou ik verwachten dat er 4 uitkomt, maar er komt 3.0 uit. Ik heb al een ceiling toegevoegd toegevoegd aan removefirst, aangezien ik hoopte dat het een afrondingsprobleem was...

Voor heel veel (ook hele grote getallen) werkt het uitstekend, bijvoorbeeld :
code:
1
(firstnum (removefirst (removefirst (removefirst 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000))))


Levert keurig 2.0 op.

Ik gebruik DrRacket 5.1 met als taal R5RS.

Is er misschien een bignum achtige library die ik moet gebruiken oid?

  • KopjeThee
  • Registratie: Maart 2005
  • Niet online
Wat probeer je te doen?

  • Armageddon_2k
  • Registratie: September 2002
  • Laatst online: 16:31

Armageddon_2k

Trotse eigenaar: Yamaha R6

Zal em aan mij liggen maar:
RemoveFirst. Hoort dat niet op een array of een list? (dus niet op een string)
En hoor je ook niet aan te geven wat voor item je wilt verwijderen?
Dus RemoveFirst("<Dit wil ik removen>", "Dit is mijn string waaruit ik dingen wil verwijderen")

  • st0p
  • Registratie: April 2004
  • Laatst online: 19-07-2024
Ik probeer het eerste getal van een ander getal af te hakken en dan het volgende getal over te houden...
Stel mijn getal is 536, dan wil ik 3 als resultaat. Vandaar de trucs met logaritmes.
Armageddon_2k schreef op maandag 11 april 2011 @ 16:30:
Zal em aan mij liggen maar:
RemoveFirst. Hoort dat niet op een array of een list? (dus niet op een string)
En hoor je ook niet aan te geven wat voor item je wilt verwijderen?
Dus RemoveFirst("<Dit wil ik removen>", "Dit is mijn string waaruit ik dingen wil verwijderen")
Op zich heb je gelijk, maar ik ben nog niet toegekomen aan de cons, car en cdr in scheme. Oftewel ik probeerde het op te lossen zonder gebruik te maken van arrays maar met wiskunde. Tijdens het tikken van de code had ik al zon idee dat niet echt effectief ging zijn, maar het leek te werken. Hoewel het de hoogste tijd is om te leren te werken met arrays in scheme (en iets te vinden om een int om te zetten in een cons oid), wou ik het eerst zo proberen.