Hi!

I think(*) you can use "%a" to print the hexadecimal representation of a floating point number. This prints the floating point number exactly, down to the last bit in the mantissa. It looks like 0x0.3p10, where 0x0.3 is the "significant" part and "p10" the binary exponent, and it represents the number 0x0.3 * 2^10.

In the tradition of NSTRACE, you can define a macro for the format string (to ensure that all functions that print colors use the same format). For example:

    #define NSTRACE_FMT_RGB "(R:%a G:%a B:%a)"

And another to push the arguments:

    #define NSTRACE_ARG_RGB(color) (color).redComponent, (color).greenComponent, (color).blueComponent

With this, you should be able to print the color values ergonomically using:

    NSTRACE("The colors are " NSTRACE_FMT_RGB, NSTRACE_ARG_RGB([background_color colorUsingDefaultColorSpace]));

To make this even shorter, you can define the macro "NSTRACE_RGB" along the lines of "NSTRACE_SIZE" and "NSTRACE_POINT".

* Currently, I can't test this, as I have no mac nearby.

    -- Anders


On Tue, Aug 22, 2017 at 6:30 AM, Keith David Bershatsky <esq@lawlist.com> wrote:
Thank you, Paul, for the suggestion to use dtoastr.  I tried that and a few variations, but got stuck because dtoastr returns an `int` and `%s` expects a `char` value.  Substituting `%s` for `%d` did not yield the correct results.

Keith

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

DATE:  [08-21-2017 16:55:08] <21 Aug 2017 16:55:08 -0700>
FROM:  Paul Eggert <eggert@cs.ucla.edu>
>
> * * *
>
> E.g., something like the following (untested) C code. Although this
> assumes CGFloat is 'double', and outputs excess precision on 32-bit
> platforms where CGFloat is 'float', it would be easy to fix that if you
> like the idea.
>
> #include <ftoastr.h>
>
> void
> example (CGFloat value)
> {
>    char buf[DBL_BUFSIZE_BOUND];
>    NSTRACE ("float: %s", dtoastr (buf, sizeof buf, 0, 0, value));
> }