Go to file
Jon Severinsson 53e6cb3ff6 Fix the gregorian date <-> julian day calculations in QDate
The old code is just plain wrong for negative julian days. Replaced
with plain math from The Calendar FAQ [1], which is correct for all
julian days, provided you use mathematical integer division (round to
negative infinity) rather than c++11 integer division (round to zero).

[1] http://www.tondering.dk/claus/cal/julperiod.php

While the conversion code works for up to around JD +/- (2^63/4), we
only use an int for the year in the API, so this patch limits minJd()
and maxJd() to 1 Jan (2^31) BC and 31 Dec (2^31-1) AD, respectively.

Note that while the new conversion code looks like it would be more
expensive than the old, gcc will in fact be able to optimize it to be
slightly faster (probably because x86 hardware implements round to
negative infinity, and so GCC manages to optimize floordiv to a single
instruction, compared to the three instuctions needed for operator/).

In the following test application, run with a release mode Qt and
redirecting stderr to /dev/null, I measured an improvement from
6.81s +/- 0.08s to 6.26s +/- 0.16s user time over five runs on an
otherwise idle x86_64 system.

int main(int, char *[])
{
    int year, month, day;
    qint64 jd;
    for (qint64 i = Q_INT64_C(-1048576) ; i < Q_INT64_C(1048576); ++i) {
        QDate::fromJulianDay(i).getDate(&year, &month, &day);
        jd = QDate(year, month, day).toJulianDay();
        qDebug() << jd << year << month << day;
    }
}

Change-Id: Ifd0dd01f0027f260401f7f9b4f1201d2b7a3b087
Reviewed-by: David Faure (KDE) <faure@kde.org>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
2012-11-02 12:16:49 +01:00
bin Rename the syncqt -qtdir to -mkspecsdir 2012-10-19 00:44:54 +02:00
config.tests Made xcb plugin work when the GLX extension is not present. 2012-10-19 18:11:06 +02:00
dist Do the actual removal of the Soft Keys API and related code 2012-10-29 20:27:27 +01:00
doc CONFIG+=uitools is deprecated. Use QT+=uitools instead 2012-10-31 19:56:55 +01:00
examples Do the actual removal of the Soft Keys API and related code 2012-10-29 20:27:27 +01:00
lib Initial import from the monolithic Qt. 2011-04-27 12:05:43 +02:00
mkspecs let static plugins have "module" pri files 2012-11-01 22:35:28 +01:00
qmake rewrite default spec handling 2012-11-01 20:17:57 +01:00
src Fix the gregorian date <-> julian day calculations in QDate 2012-11-02 12:16:49 +01:00
tests Fix the gregorian date <-> julian day calculations in QDate 2012-11-02 12:16:49 +01:00
tools move remaining configure'd CONFIG flags to qmodule.pri 2012-11-01 22:27:09 +01:00
util CONFIG+=uitools is deprecated. Use QT+=uitools instead 2012-10-31 19:56:55 +01:00
.gitattributes Update the git-archive export options 2012-09-07 15:39:31 +02:00
.gitignore Drop Symbian Carbide settings from .gitignore 2012-10-26 11:53:06 +02:00
.qmake.conf add a .qmake.conf file which load()s qt_build_config 2012-10-18 17:42:40 +02:00
.tag Update the git-archive export options 2012-09-07 15:39:31 +02:00
configure move remaining configure'd CONFIG flags to qmodule.pri 2012-11-01 22:27:09 +01:00
configure.bat Change copyrights from Nokia to Digia 2012-09-22 19:20:11 +02:00
header.BSD Change copyrights from Nokia to Digia 2012-09-22 19:20:11 +02:00
header.FDL Change copyrights from Nokia to Digia 2012-09-22 19:20:11 +02:00
header.LGPL Change copyrights from Nokia to Digia 2012-09-22 19:20:11 +02:00
header.LGPL-ONLY Change copyrights from Nokia to Digia 2012-09-22 19:20:11 +02:00
INSTALL fix links in INSTALL 2012-10-10 08:45:22 +02:00
LGPL_EXCEPTION.txt Change copyrights from Nokia to Digia 2012-09-22 19:20:11 +02:00
LICENSE.FDL Initial import from the monolithic Qt. 2011-04-27 12:05:43 +02:00
LICENSE.GPL Add the LICENSE.GPL file to the module referenced from license headers 2012-05-20 22:41:08 +02:00
LICENSE.LGPL Change copyrights from Nokia to Digia 2012-09-22 19:20:11 +02:00
LICENSE.PREVIEW.COMMERCIAL Change copyrights from Nokia to Digia 2012-09-22 19:20:11 +02:00
qtbase.pro rewrite default spec handling 2012-11-01 20:17:57 +01:00
sync.profile Enable the "#include <QSql>" camel-case header, for the QSql namespace 2012-10-27 22:21:46 +02:00