Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What does floating point error -1.#J mean?

Recently, sometimes (rarely) when we export data from our application, the export log contains float values that look like "-1.#J". I haven't been able to reproduce it so I don't know what the float looks like in binary, or how Visual Studio displays it.

I tried looking at the source code for printf, but didn't find anything (not 100% sure I looked at the right version though...).

I've tried googling but google throws away any #, it seems. And I can't find any lists of float errors.

like image 946
Srekel Avatar asked May 08 '09 14:05

Srekel


People also ask

What is floating-point representation error?

It's a problem caused when the internal representation of floating-point numbers, which uses a fixed number of binary digits to represent a decimal number. It is difficult to represent some decimal number in binary, so in many cases, it leads to small roundoff errors.

What is meant by a floating-point?

A floating point number, is a positive or negative whole number with a decimal point. For example, 5.5, 0.25, and -103.342 are all floating point numbers, while 91, and 0 are not. Floating point numbers get their name from the way the decimal point can "float" to any position necessary.

What is floating-point overflow error?

When a program attempts to do that a floating point overflow occurs. In general, a floating point overflow occurs whenever the value being assigned to a variable is larger than the maximum possible value for that variable. Floating point overflows in MODFLOW can be a symptom of a problem with the model.

What is the main problem with floating-point numbers?

The Problem Since real numbers cannot be represented accurately in a fixed space, when operating with floating-point numbers, the result might not be able to be fully represented with the required precision.


1 Answers

It can be either negative infinity or NaN (not a number). Due to the formatting on the field printf does not differentiate between them.

I tried the following code in Visual Studio 2008:

double a = 0.0;
printf("%.3g\n", 1.0 / a);  // +inf
printf("%.3g\n", -1.0 / a); // -inf
printf("%.3g\n", a / a);    //  NaN

which results in the following output:

1.#J
-1.#J
-1.#J

removing the .3 formatting specifier gives:

1.#INF
-1.#INF
-1.#IND

so it's clear 0/0 gives NaN and -1/0 gives negative infinity (NaN, -inf and +inf are the only "erroneous" floating point numbers, if I recall correctly)

like image 59
Tobi Avatar answered Oct 12 '22 20:10

Tobi