Albert Einstein: A question that sometime drives me hazy: Am I or are the others crazy?
Verwijderd
dan wordt het
0-epsilon<berekende_waarde<0+epsilon
otw
-epsilon<berkende_waarde<epsilon
dat zou nog wel eens kunnen werken
Albert Einstein: A question that sometime drives me hazy: Am I or are the others crazy?
Verwijderd
Het makkelijkst is om een tolerantiewaarde 'delta' in te bouwen, waarvoor 0-delta<=Cos(Pi/2)<=0+delta.
too slow
Als je echt decimale berekeningen wilt hebben moet je overigens de BigDecimal van IBM hebben. De klasse in de standaard Java library gebruikt geen decimale berekeningen. Er zit echter geen cos, sin, tan functie in dus die zal je zelf moeten schrijven of via Google ergens vinden. Er zijn een hoop wiskundige libraries op het web en daar zit vast wel iets tussen... PI in BigDecimal is overigens ook weer een probleem apart. Wellicht dat die ook ergens te vinden is
Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment
Verwijderd
java rond alles intern ook al af, en houd hier dan verder geen rekening mee
Men neme een kubus:
omhoog = Y, rechts = Z, en naar voren is Z
er zijn 2 rotaties mogenlijk:
rotY (rotatie om de Y as) en rotR (rotatie vanuit het 0 punt met de camera omhoog)
constante R = 2 (afstand)
sommetjes:
Q = cos(rotR)*R
Y = sin(rotR)*R
X = sin(rotY)*Q
Z = cos(rotY)*Q
verder moet ik de rotaties over de 2 andere assen hebben:
rotX=tan(Y/Z)
rotZ=tan(Y/X)
Nu is dus 1 van de problemen: als rotY = 0 dan moet rotX gelijk zijn naar rotR Als rotY 1/2*Pi = dan moet rotZ gelijk zijn aan rotR
maar door die domme interne afronding van java is dat dus nooit gelijk.
nu kan ik door een paar ifstatements af te vangen dit corrigeren, maar dit is nog maar het begin.
bij een rotY van 1/32*Pi dan kloppen de waarden ook al niet
kortom: Java kan mijn geavanceerde wiskunde gewoon niet aan.
Albert Einstein: A question that sometime drives me hazy: Am I or are the others crazy?
Verwijderd
Note: BigDecimal zit niet alleen in IBM api maar tevens ook in de SDK van Sun, te vinden in java.math
Greetz, daRoBBie.
Verwijderd
Dat is dus een hele andere implementatie. In de toekomst zal deze misschien worden opgenomen in Java ipv de huidige implementatie van Sun.daRoBBie: Note: BigDecimal zit niet alleen in IBM api maar tevens ook in de SDK van Sun, te vinden in java.math
Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment
Maar ik heb het probleem al veel simpeler opgelost..
De camera heeft z'n eigen assenstelsel.. dus ik roteer hem eerst en plaats hem vervolgens 2 naar achteren.
Dus hij roteerd nu eerst in de juiste positie en vervolgens op de juiste afstand
Problem solved
Maar ik blijf erbij dat het dom is dat Java dat niet goed kan
Albert Einstein: A question that sometime drives me hazy: Am I or are the others crazy?
Wat doet java dan niet goed? reken het zelf maar na, dan kom je ook op die uitkomst. Jij verteld JAVA namelijk niet met PI te werken maar met een waarde die er zo dicht mogelijk in de buurt ligt, en met die gebruikte waarde komt JAVA op die uitkomst. Ook jou rekenmachine doet dat, die rond de uitkomst alleen weer af naar een minder preciese waarde. converteer de double maar naar een single dan wordt ie als het goed is gewoon nul. Je wilt natuurlijk niet dat JAVA die afronding standaard al voor je gaat doen want dat kost performance in het geval als dat niet belangrijk is.Op vrijdag 15 maart 2002 13:39 schreef OxiMoron het volgende:
Maar ik blijf erbij dat het dom is dat Java dat niet goed kan
Opera OpenOffice.org Jabber Psi jabber://llama@mordax.com
Als je er verder mee wilt rekenen kan dat gewoon, O(-16) is echt genoeg dicht bij 0.
Als je de uitkomst wilt vergelijken zul je dat toch moeten doen XKB het voorstelt. Kijk of het verschil tussen de twee getallen kleiner is dan een bepaalde vaste waarde, bv 1.0e-9. Hier ontkom je niet aan als je met floating point getallen werkt, niemand ontkomt hier aan.
Mijn advies : als je wilt blijven rekenen met floating point getallen zul je moeten accepteren dat je ze niet zomaar kunt vergelijken.
die kleine afwijking kan uiteindelijk fataal worden.
Albert Einstein: A question that sometime drives me hazy: Am I or are the others crazy?
Dan moet je zorgen dat die kleine afwijking zich niet propageert. Het is onzin om de schuld hiervan bij de programmeertaal te leggen. Als dit het geval is moet je je numerieke methode bekijken.Op vrijdag 15 maart 2002 20:51 schreef OxiMoron het volgende:
Het ging om een positie/rotatie van een camera in een viruele ruimte.
die kleine afwijking kan uiteindelijk fataal worden.
BTW, een getal in de ordegrootte van 10^(-16) is precies genoeg voor mij in mijn dagelijks leven als software ontwikkelaar. Dit terwijl ik software schrijf die moet zorgen dat machines met een preciese van enkele nanometers moet werken (dus 10^(-9))
rekenmachines ronden automatisch af en denken slim te zijn door 0.000000000000000 weer te geven als 0Op vrijdag 15 maart 2002 09:51 schreef daxx909 het volgende:
Wat ik dan wel weer raar vind, is dat een simpel Casio machientje die afrondingen wél goed maakt...
Experience has taught me that interest begets expectation, and expectation begets disappointment, so the key to avoiding disappointment is to avoid interest.
matrix (3 + 5)
en niet
matrix (3) * matrix (5)
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.