Mail Archives: cygwin/2007/02/16/06:28:27
--==========7883D2DD509F37E8653F==========
Content-Type: text/plain; charset=us-ascii; format=flowed
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
--On 16 February 2007 04:12 +0300 Andrew Makhorin <mao AT gnu DOT org> wrote:
>>> double get_time(void)
>>> { struct timeval tv;
>>> gettimeofday(&tv, NULL);
>>> return (double)tv.tv_sec + 1e-6 * (double)tv.tv_usec;
>>> }
>>
>> I would be suspicious of floating-point rounding errors here for the
>> original problem you described. Why don't you try a test case that just
>> checks if one tv is ever less than a previous tv, without the
>> conversions.
>
> But then I would like to know why comparison of two floating-point
> numbers leads to different results: t0 is *exactly* the same as t1,
> nevertheless the condition t0 > t1 is true (sometimes). That is the
> question.
The multiplier 1e-6 cannot be represented exactly in binary floating point.=
=20
Therefore the internal representation of your tv_usec will always be=20
subject to rounding errors, maybe upwards or maybe downwards. Therefore,=
=20
the result of this function will never be an accurate representation of the=
=20
time as returned by struct timeval. The impact of the rounding error will=
=20
depend on at what point the internal 80-bit value in the processor is=20
rounded to 64 bits for storage as a double.
If you really must do this (and it is not advised) you might do better by=
=20
multiplying tv_sec by 1e6 then adding tv_usec unscaled, so that the=20
floating point variable holds an integer number of microseconds.
Also, if tv_sec is large, there might be significant loss of precision as=
=20
tv_sec and tv_usec are shifted 6 decimal places (about 20 binary places)=20
relative to each other in the mantissa.
Floating point representation should never be used for something for which=
=20
you need an accurate value, or where you require to test for two things=20
being equal. You have a struct which conveys the time accurately: why not=
=20
use that? It is trivial to write functions which compare two timevals for=
=20
equality, or yield the difference between two timevals.
Another possible factor to bear in mind has already been alluded to:=20
Windows clock slew. Because PC clocks do not keep accurate time, Windows=
=20
calibrates the internal clock against an external source (in XP, this is by=
=20
default time.microsoft.com). By comparison of the two clocks, Windows=20
calculates a slew by which it occasionally adjusts the PC clock to keep the=
=20
time of day in step with the external source. I do not know whether this=
=20
factor is relevant to the data returned by gettimeofday().
--=20
Robin Walker (Junior Bursar), Queens' College, Cambridge CB3 9ET, UK
rdhw AT cam DOT ac DOT uk http://www.queens.cam.ac.uk/ Tel:+44 1223 335528
--==========7883D2DD509F37E8653F==========
Content-Type: application/pkcs7-signature
Content-Transfer-Encoding: base64
MIIPuwYJKoZIhvcNAQcCoIIPrDCCD6gCAQExCzAJBgUrDgMCGgUAMAsGCSqG
SIb3DQEHAaCCDYAwggPnMIIDUKADAgECAhB/XB5Eipwh6JZtd6i9RCwoMA0G
CSqGSIb3DQEBBAUAMIHUMR4wHAYDVQQKExVTdHVkZW50IExvYW5zIENvbXBh
bnkxHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxPDA6BgNVBAsT
M1Rlcm1zIG9mIHVzZSBhdCBodHRwczovL3d3dy50cnVzdHdpc2UuY29tL3Jw
YSAoYykwMzEwMC4GA1UECxMnQ2xhc3MgMiBPblNpdGUgSW5kaXZpZHVhbCBT
dWJzY3JpYmVyIENBMSEwHwYDVQQDExhTdHVkZW50IExvYW5zIENvbXBhbnkg
Q0EwHhcNMDYwODE3MDAwMDAwWhcNMDcwOTE1MjM1OTU5WjCB/jELMAkGA1UE
BhMCR0IxEjAQBgNVBAcUCUNhbWJyaWRnZTEqMCgGA1UEChQhVGhlIFN0dWRl
bnQgTG9hbnMgQ29tcGFueSBMaW1pdGVkMR4wHAYDVQQLExV3d3cudHJ1c3R3
aXNlLmNvbS9ycGExIzAhBgNVBAsUGk1haWxTdG9wIC0gUXVlZW5zJyBDb2xs
ZWdlMRwwGgYDVQQLFBNMRUEvSEVJIENvZGUgLSBDQUVFMRYwFAYDVQQMFA1K
dW5pb3IgQnVyc2FyMRUwEwYDVQQDEwxSb2JpbiBXYWxrZXIxHTAbBgkqhkiG
9w0BCQEWDnJkaHdAY2FtLmFjLnVrMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJB
ANk5fuWXoV1q2IIIUCYLVs0wM5bHBQ0dEF0AGFe/JdQrJNj4jUdsQSejp8HJ
+csNokcUY0MDdiFvksGyuszn/CMCAwEAAaOB0TCBzjAJBgNVHRMEAjAAMEQG
A1UdIAQ9MDswOQYKYIZIAYb4RQEHCTArMCkGCCsGAQUFBwIBFh1odHRwczov
L3d3dy50cnVzdHdpc2UuY29tL3JwYTALBgNVHQ8EBAMCBaAwEQYJYIZIAYb4
QgEBBAQDAgeAMFsGA1UdHwRUMFIwUKBOoEyGSmh0dHA6Ly9vbnNpdGVjcmwu
dHJ1c3R3aXNlLmNvbS9UaGVTdHVkZW50TG9hbnNDb21wYW55TGltaXRlZC9M
YXRlc3RDUkwuY3JsMA0GCSqGSIb3DQEBBAUAA4GBAEdZ4gUFj7rMntVJAyxI
LcOdhDgMlbFKp+4dmbAjachVQy0ZK6iaIxpit2SW5xvl7u0YyE5meLzRMMkq
7IXX+GNSEIcr13c0PQksem6i/vTcYCw1nK9JNafSG6snytqmJ0cTVp7E0vAP
CRLTDUBYYgeGUDFwqQlKjaAKdMNKvk8KMIIDYjCCAsugAwIBAgIQZlpoaaRJ
nbo/tOG5fY8NkzANBgkqhkiG9w0BAQQFADBkMScwJQYDVQQKEx5Ccml0aXNo
IFRlbGVjb21tdW5pY2F0aW9ucyBwbGMxHzAdBgNVBAsTFlZlcmlTaWduIFRy
dXN0IE5ldHdvcmsxGDAWBgNVBAMTD0JUIFRydXN0V2lzZSBDQTAeFw0wMzA5
MTgwMDAwMDBaFw0wODA5MTcyMzU5NTlaMIHUMR4wHAYDVQQKExVTdHVkZW50
IExvYW5zIENvbXBhbnkxHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
cmsxPDA6BgNVBAsTM1Rlcm1zIG9mIHVzZSBhdCBodHRwczovL3d3dy50cnVz
dHdpc2UuY29tL3JwYSAoYykwMzEwMC4GA1UECxMnQ2xhc3MgMiBPblNpdGUg
SW5kaXZpZHVhbCBTdWJzY3JpYmVyIENBMSEwHwYDVQQDExhTdHVkZW50IExv
YW5zIENvbXBhbnkgQ0EwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALa0
MyhCbExYSe88SbETURStgVHxxboMuzV0TOSMUS76PTT9cnpy5IqCWt6NndWy
fVcOPtCCCAgoOH1yDS3F4kIlKnOBCIIXv7ExFFBOESPBp6aNQ4Zek8gu16wZ
0v1ruYF1kOsyyuKcitlJIvhjKvx5lmQFa9FYUqSiF9U1TNsDAgMBAAGjgaMw
gaAwDwYDVR0TBAgwBgEB/wIBADBFBgNVHSAEPjA8MDoGC2CGSAGG+EUBBxcC
MCswKQYIKwYBBQUHAgEWHWh0dHBzOi8vd3d3LnRydXN0d2lzZS5jb20vcnBh
MAsGA1UdDwQEAwIBBjARBglghkgBhvhCAQEEBAMCAQYwJgYDVR0RBB8wHaQb
MBkxFzAVBgNVBAMTDmJ0YzJvbnNpdGUxLTEzMA0GCSqGSIb3DQEBBAUAA4GB
AKFq2zZnXaspVfkukjegQ1qYS//0eqE5lvxndZJLIwqgfQ55K/BQL38NX6Qu
NiiGf/GU7pixSiCE5rVCsOX7hP712Jhbb2/BHmdd4andkd7Odo2bUV6nmNjY
Rp7g30Z1trEjAEXCvpTD2Nb9VkijBe/jvuTDuiWtl6qnryiSULCcMIIDJDCC
Ao2gAwIBAgIQcFoaAbh84F1u3DpAgpiMGDANBgkqhkiG9w0BAQQFADCBwTEL
MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTwwOgYDVQQL
EzNDbGFzcyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y
aXR5IC0gRzIxOjA4BgNVBAsTMShjKSAxOTk4IFZlcmlTaWduLCBJbmMuIC0g
Rm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAsTFlZlcmlTaWduIFRy
dXN0IE5ldHdvcmswHhcNOTkwODE5MDAwMDAwWhcNMTQwMTA2MjM1OTU5WjBk
MScwJQYDVQQKEx5Ccml0aXNoIFRlbGVjb21tdW5pY2F0aW9ucyBwbGMxHzAd
BgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxGDAWBgNVBAMTD0JUIFRy
dXN0V2lzZSBDQTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEApUGJBlbV
EdU4veD4N0zAH/2RvFDs/tU3/gXxOzFO/AD0N/O+1RnlJWN/g94GyVghgcEZ
O7BA1SEFlTjOs6u+Bq6B/STxkPddlURpOOC3q31YSPiHkdqtQsb40RFE7ZW9
kZooaxnJM9/dUQsBDYeBkNpLaorYZLwBCwSKDfI/l3UCAwEAAaN5MHcwEQYJ
YIZIAYb4QgEBBAQDAgEGMEQGA1UdIAQ9MDswOQYKYIZIAYb4RQEHCTArMCkG
CCsGAQUFBwIBFh1odHRwczovL3d3dy50cnVzdHdpc2UuY29tL1JQQTAPBgNV
HRMECDAGAQH/AgEBMAsGA1UdDwQEAwIBBjANBgkqhkiG9w0BAQQFAAOBgQBf
qGorIHXS8AcaIMa/suA2DF0ZFtq2ULNHvkV4E1uIeee1nwlFKpQ5/G0tWTfM
KThNyIQuE7IdYuBhiZUELtJbJd3M3dvrYxx0g98EY4V1RBM4ZK33tc5n3keQ
Kb+yzBjyLm1/32SH1EqmSCS8cD/x3t0L6V5Vrp0NevQFOA1UQTCCAwMwggJs
AhEAuS9gzIifoXpGCbhbcGyKrzANBgkqhkiG9w0BAQUFADCBwTELMAkGA1UE
BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTwwOgYDVQQLEzNDbGFz
cyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0g
RzIxOjA4BgNVBAsTMShjKSAxOTk4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1
dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5l
dHdvcmswHhcNOTgwNTE4MDAwMDAwWhcNMjgwODAxMjM1OTU5WjCBwTELMAkG
A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTwwOgYDVQQLEzND
bGFzcyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5
IC0gRzIxOjA4BgNVBAsTMShjKSAxOTk4IFZlcmlTaWduLCBJbmMuIC0gRm9y
IGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0
IE5ldHdvcmswgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAKeIASF0LOca
A/CY4Zc8DyEI8Zzbl+ma/MIEBhO+X1LIzB4sElYsuAFpLMyZH62wlq55BPIT
OcF7mLoILOjChBMsqmnpCfTHqQKkQsIjT0rY8A6i+zFsyeZvmScH9eb0THie
betGhvq5hslU8rLEr9RGHFrJFTD/DWz1LQ5tzn93AgMBAAEwDQYJKoZIhvcN
AQEFBQADgYEAci75f9HxcfvEnvbFXlGKQJi4aPibHIPY4p29/+2h5mbqLwn0
ytfqpSuV9iRghk1ELoOlxC2g0654aW9y2myuCPBjkjfmu8QwF613zEk1qs/Y
j9G+txiWR3NqVCI0ZC22FptZW7RRWTqzCxT0Et9noPStMmResUZyJ4wSe8VE
tK4xggIDMIIB/wIBATCB6TCB1DEeMBwGA1UEChMVU3R1ZGVudCBMb2FucyBD
b21wYW55MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTwwOgYD
VQQLEzNUZXJtcyBvZiB1c2UgYXQgaHR0cHM6Ly93d3cudHJ1c3R3aXNlLmNv
bS9ycGEgKGMpMDMxMDAuBgNVBAsTJ0NsYXNzIDIgT25TaXRlIEluZGl2aWR1
YWwgU3Vic2NyaWJlciBDQTEhMB8GA1UEAxMYU3R1ZGVudCBMb2FucyBDb21w
YW55IENBAhB/XB5Eipwh6JZtd6i9RCwoMAkGBSsOAwIaBQCggbEwGAYJKoZI
hvcNAQkDMQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMDcwMjE2MTEy
NzUxWjAjBgkqhkiG9w0BCQQxFgQUGsmblNn0MNDnJcwYnHPaGvnCzOMwUgYJ
KoZIhvcNAQkPMUUwQzAKBggqhkiG9w0DBzAOBggqhkiG9w0DAgICAIAwDQYI
KoZIhvcNAwICAUAwBwYFKw4DAgcwDQYIKoZIhvcNAwICASgwDQYJKoZIhvcN
AQEBBQAEQNOEGsfzVLL++9ZyBft9gYn0jIFCRnavIRNiqKI2tjRZNpw1+vtq
bPscVIQuaBfUBFqlbg9zzx10dVJxdg/8UNI=
--==========7883D2DD509F37E8653F==========--
- Raw text -