February 28th, 2013

What does 1#J mean? A strange corner case of the printing of special values

As a puzzle, commenter nobugz asks, “What kind of infinity is 1.#J?”

double z = 0;
printf(“%.2f”, 1/z);

Now, the division by zero results in IEEE positive infinity, would would normally be printed as 1#INF. But the catch here is that the print format says “Display at most two places after the decimal point.” But where is the decimal point in infinity?

The Visual C runtime library arbitrarily decided that all of the exceptional values have one digit before the decimal (namely, the “1”). Actually, it turns out that this puzzle might be an answer to Random832’s question, “What’s the 1 for?” Maybe the 1 is there so that there is a digit at all.

Okay, so now you have one digit before the decimal (the “1”), and now you need to show at most two places after the decimal. But “#INF” is too long to fit into two characters. The C runtime then says, “Well, then I’d better round it off to two places, then.”

The first character is “#”. The second character is “I”. Now we need to round it. That’s done by inspecting the third character, which is “N”. We all learned in grade school that you round up if the next digit is 5 or greater. And it so happens that the code point for “N” is numerically higher than the code point for “5”, so the value is rounded up by incrementing the previous digit. Incrementing “I” gives you “J”.

That’s why printing IEEE positive infinity to two places gives you the strange-looking “1#J”. The J is an I that got rounded up.

I doubt this behavior was intended; it’s just a consequence of taking a rounding algorithm intended for digits and applying it to non-digits.

Of course, in phonetics, rounding an i produces a ü. Imagine the nerdiness of rounding “1#INF” to two places and producing “1#Ü”. That would have been awesome.

Topics
Code

Author

Raymond has been involved in the evolution of Windows for more than 30 years. In 2003, he began a Web site known as The Old New Thing which has grown in popularity far beyond his wildest imagination, a development which still gives him the heebie-jeebies. The Web site spawned a book, coincidentally also titled The Old New Thing (Addison Wesley 2007). He occasionally appears on the Windows Dev Docs Twitter account to tell stories which convey no useful information.

0 comments

Discussion are closed.