Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Negative infinity

I'm trying to figure out how to assign the value of negative infinity to a float or double variable. It seems that including the standard library limits, I can get the infinity representation, and I know (quite surely) that adding a minus in front of that (-infinity) might result in the value I'm looking for in the IEEE754 floating point standard (as 0x7FFFFFFF might result on 0xFFFFFFFF), but I'm not even sure about that, not to mention other standards that might be out there (If there are any). I find it really, really unprofessional and implementation dependant.

Is there a good way to get the value of negative infinity platform and implementation independently, of course, otherwise I might just as well use a #define, everybody likes preprocessing.

like image 397
Setzer22 Avatar asked Nov 16 '13 08:11

Setzer22


People also ask

Is negative Infinite a thing?

The limit as x approaches zero would be negative infinity, since the graph goes down forever as you approach zero from either side: As a general rule, when you are taking a limit and the denominator equals zero, the limit will go to infinity or negative infinity (depending on the sign of the function).

Is negative infinity zero?

No.

Is negative infinity the same as infinity?

It looks like a ring, so the positive infinity and negative infinity is actually the same point. The benefit of this model is it allows us a continuous transition from the positive numbers to the negative numbers. .


2 Answers

At least if std::numeric_limits::is_iec559 (IEEE 754) is true (which guarantees, that std::numeric_limits::has_infinity is also true), you can express positive and negative infinity values the way you already stated.

Short explanation of IEEE 754-1985 infinity values from Wikipedia:

......snip......

The biased-exponent field is filled with all 1 bits to indicate either infinity or an invalid result of a computation.

Positive and negative infinity

Positive and negative infinity are represented thus:

 sign = 0 for positive infinity, 1 for negative infinity.  biased exponent = all 1 bits.  fraction = all 0 bits. 

......snip......

Assertions

The following example will either work as expected, or cause a compile time error in case the target platform does not support IEEE 754 floats.

#include <cstdlib> #include <cmath> #include <cassert> #include <limits>  int main(void) {     //Asserts floating point compatibility at compile time     static_assert(std::numeric_limits<float>::is_iec559, "IEEE 754 required");      //C99     float negative_infinity1 = -INFINITY;     float negative_infinity2 = -1 * INFINITY;      float negative_infinity3 = -std::numeric_limits<float>::infinity();     float negative_infinity4 = -1 * std::numeric_limits<float>::infinity();      assert(std::isinf(negative_infinity1) && negative_infinity1 < std::numeric_limits<float>::lowest());     assert(std::isinf(negative_infinity2) && negative_infinity2 < std::numeric_limits<float>::lowest());     assert(std::isinf(negative_infinity3) && negative_infinity3 < std::numeric_limits<float>::lowest());     assert(std::isinf(negative_infinity4) && negative_infinity4 < std::numeric_limits<float>::lowest());      return EXIT_SUCCESS; } 
like image 64
Sam Avatar answered Oct 10 '22 10:10

Sam


If std::numeric_limits<double>::is_iec559 is true then it should be safe to use -

double negative_infinity = - std::numeric_limits<double>::infinity();

(IEC559 is the ISO equivalent of IEEE754)

If it's false then there's a whole lot more work to do as I don't think the C++ standard gives you any help.

like image 33
Ian Cook Avatar answered Oct 10 '22 09:10

Ian Cook