Important: Please read the Qt Code of Conduct -

How to write qreal literals correctly?

  • How do I write qreal literals, so they do not need to be cast regardless on what CPU architecture I compile?

    E.g. I use qMax

    qreal someValue = calcFunc();
    qreal min = qMin(someValue, 0.0);

    The qMin compiles fine on a PC, but throws a compile error on an ARM platform - no qMin exists, which would allow two different types to be compared.

    Of course I can write the ugly
    qreal min = qMin(someValue, static_cast<qreal>(0.0));

    but I feel there must be a better way to write a qreal-literal.

    Do you know it?

  • Hi,
    In basic this has noting to do with qReal values! It is stated in the docs that a qreal is a double on all platforms excluding the ARM achitecture, there it is a float.
    For the qMin to work you only need a template capable type, and float is just that.
    Do you include the QtGlobal at the top of the file? Maybe the compiler for the PC application runs a bit different then your ARM compiler? That might do the trick.

  • If you read the code above carefully, you'll see that on a PC, it evaluates to
    qMin<double, double>
    whereas on ARM it evaluates to
    qMin<float, double>
    since a literal written like '0.0' is a double.

    If I wrote '0.0f', it would work on ARM but not on the PC.

    I am looking for something like '0.0q', which makes the literal either float or double - depending on the platform.

    Edit: Typo

  • Well, maybe a compiler switch should do the trick.
    qmin (float, float)
    qMin(double, double)

  • As I wrote above, it does work when using the static_cast<qreal>, it's just ugly.

    A compiler switch would be even uglier in my book, unless it's something I could do once and then forget about. But I don't see how I would be able to pull off that trick.

Log in to reply