[BCB6 C++] foute returnwaarde TDateTime

Pagina: 1
Acties:

  • dexter07051982
  • Registratie: November 2001
  • Laatst online: 16-07-2025
hoi

ik vergelijk twee TDateTime waardes met elkaar.
Als ik in de debugger kijk wat de waarde van deze dingen is zijn die exact gelijk. Maar volgens het returntype is de ene kleiner dan de andere.

Iemand hetzelfde probleem gehad? of weet wat de oplossing is.

(De waardes die vergeleken worden zijn eigenlijk gewoon twee doubles)
ik vind het allemaal heel vaag. heb ook al bij borland gekeken, maar kan daar ook niets vinden.

  • Eskimootje
  • Registratie: Maart 2002
  • Laatst online: 16:25
heb je stukje code? zo word het erg lastig om de fout te vinden

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 00:01

Janoz

Moderator Devschuur®

!litemod

Floatingpoint getallen moet je nooit rechtstreeks met elkaar vergelijken. Door afrondingsfouten zijn ze bijna nooit gelijk aan elkaar. Floating point getallen vergelijk je door te kijken of het verschil kleiner is dan een bepaalde drempelwaarde.

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


  • dexter07051982
  • Registratie: November 2001
  • Laatst online: 16-07-2025
Op een of andere manier heeft een rerun van het programma de fout opgelost
(nog vager, maar wel blij mee)

(naar aanleiding van de vraag, maar een beetje overbodig nu)

TDateTime is een standaardclass

komt op het volgende neer:
ik heb twee TDateTime varriabelen laten we zeggen jantje en pietje;
hierin wordt een datum gezet met een datumcombo (wordt ook standaard aangeleverd door borland). als ik nu in die combo's dezelfde datum zet. vind ie toch dat de ene kleiner is dan de andere.
C++:
1
jantje < pietje;


Aan het tijdsverschil kan het niet liggen. want als ik de interne waarde (double) bekijk, zijn deze exact gelijk.

  • dexter07051982
  • Registratie: November 2001
  • Laatst online: 16-07-2025
Janoz schreef op 22 april 2004 @ 13:42:
Floatingpoint getallen moet je nooit rechtstreeks met elkaar vergelijken. Door afrondingsfouten zijn ze bijna nooit gelijk aan elkaar. Floating point getallen vergelijk je door te kijken of het verschil kleiner is dan een bepaalde drempelwaarde.
Daar zullen ze bij borland dan vast wel een reden voor hebben om dat wel te doen. Ze doen dat namelijk wel.

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 00:01

Janoz

Moderator Devschuur®

!litemod

Dit is niet een borland iets. Dit geld voor alle floatingpoint bewerkingen. Een double vergelijken doe je dus ook nooit met d1==d2, maar met abs(d1-d2)<epsilon. Laat anders eens wat code zien? Ik ben erg benieuwd namelijk.

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


  • 12_0_13
  • Registratie: April 2004
  • Laatst online: 12-02 13:19
Janoz schreef op 22 april 2004 @ 13:56:
Dit is niet een borland iets. Dit geld voor alle floatingpoint bewerkingen. Een double vergelijken doe je dus ook nooit met d1==d2, maar met abs(d1-d2)<epsilon. Laat anders eens wat code zien? Ik ben erg benieuwd namelijk.
Nee hoor, gebruik fabs() hiervoor ;)

  • dexter07051982
  • Registratie: November 2001
  • Laatst online: 16-07-2025
sorry, ben geloof ik neit helemaal duidelijk geweest.
In de code die borland (c++ Builder) meeleverdt worden de twee floats (laten we zeggen f1 en f2) gewoon met == vergeleken. (TDateTime class)

datum1 == datum2.

gebruikt operator == van de TDateTime class.
hierin staat:

return(f1 == f2)

en daar zullen ze dan vast wel een reden voor hebben om die twee floats rechtstreeks met elkaar te vergelijken.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Als je een TDateTime op een datum zet, wat is dan de bijbehorende tijd? Is dat altijd 00:00, of de huidige tijd? In het laatste geval snap ik wel waarom twee identieke data ongelijk zijn, als je ze als TDateTime vergelijkt.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Datum/tijd wordt weleens opgeslagen als float. Achter de komma staat dan de tijd, voor de komma staat de datum.
Inderdaad, als je op deze manier 2x een datum aanmaakt zullen de floats met een == gelijk aan elkaar zijn.
Maar als je bewerkingen op floats gaat doen kun je geen == meer gebruiken.

Maak maar eens twee float-variabelen aan. Doe dan een paar bewerkingen op de ene, bijvoorbeeld delen door 2 of 3, en weer terugvermenigvuldigen; of tel er 0,5 bij op en trek het er weer vanaf.
Doe dan eens een '=='vergelijking op de floats. Die zijn ongelijk geworden.

Dat kan bij die datum van jou ook gebeurd zijn ; datums aangemaakt en bewerkt. Dat, of de tijd in die datums is verschillend.

G.
Pagina: 1