Infinity

From Rosetta Code
Revision as of 18:24, 15 August 2008 by rosettacode>Spoon! (javascript, python)
Task
Infinity
You are encouraged to solve this task according to the task description, using any language you may know.

Write a function which tests if infinity is supported for floating point numbers (this step should be omitted for languages where the language specification already demands the existence of infinity, e.g. by demanding IEEE numbers), and if so, returns positive infinity. Otherwise, return the largest possible number.

For languages with several floating point types, use the type of the literal constant 1.0 as floating point type.

Ada

Works with: GNAT version GPL 2007
with Ada.Text_Io; use Ada.Text_Io;
with Ada.Float_Text_Io; use Ada.Float_Text_Io;

procedure Infinities is
   F : Float := Float'Last;
   I : Float := F * 10.0; 
   Ff : Float := Float'First;
   II : Float := FF * 10.0;  
begin
   Put(Item => F);
   New_Line;
   Put(Item => I);
   New_Line;
   Put(Item => Ff);
   New_Line;
   Put(Item => Ii);
end Infinities;

Output:

 3.40282E+38
+Inf********
-3.40282E+38
-Inf********

C++

#include <limits>

double inf()
{
  if (std::numeric_limits<double>::has_infinity)
    return std::numeric_limits<double>::infinity();
  else
    return std::numeric_limits<double>::max();
}

D

<d>typeof(1.0) inf() {

 return typeof(1.0).infinity;

}</d>

Fortran

ISO Fortran 2003 or later supports an IEEE_ARITHMETIC module which defines a wide range of intrinsic functions and types in support of IEEE floating point formats and arithmetic rules.

  program to_f_the_ineffable
     use, intrinsic :: ieee_arithmetic
     integer :: i
     real dimension(2) :: y, x = (/ 30, ieee_value(y,ieee_positive_inf) /)
     
     do i = 1, 2
        if (ieee_support_datatype(x(i))) then
           if (ieee_is_finite(x(i))) then
              print *, 'x(',i,') is finite'
           else
              print *, 'x(',i,') is infinite'
           end if
           
        else
           print *, 'x(',i,') is not in an IEEE-supported format'
        end if
     end do
  end program to_f_the_ineffable

ISO Fortran 90 or later supports a HUGE intrinsic which returns the largest value supported by the data type of the number given.

  real :: x
  real :: huge_real = huge(x)

Haskell

The Haskell 98 standard does not require full IEEE numbers, and the required operations on floating point numbers leave some degree of freedom to the implementation. Also, it's not possible to use the type of the literal 1.0 to decide which concrete type to use, because Haskell number literals are automatically converted.

Nevertheless, the following may come close to the task description:

maxRealFloat :: RealFloat a => a -> a
maxRealFloat x = encodeFloat b (e-1) `asTypeOf` x where
  b     = floatRadix x - 1
  (_,e) = floatRange x

infinity :: RealFloat a => a
infinity = if isInfinite inf then inf else maxRealFloat 1.0 where
  inf = 1/0 

Test for the two standard floating point types:

*Main> infinity :: Float
Infinity
*Main> infinity :: Double
Infinity

IDL

IDL provides the standard IEEE values for _inf and _NaN in the !Values system structure:

print, !Values.f_infinity             ;; for normal floats or
print, !Values.D_infinity             ;; for doubles  

J

Positive infinity is produced by the primary constant function _:
It is also represented directly as a numeric value by an underscore, used alone.

Io

inf := 1/0

Java

Java does not have a test for the existence of infinity, but it does have the concept in the Double class.

double infinity = Double.POSITIVE_INFINITY; //defined as 1.0/0.0
Double.isInfinite(infinity); //true

As a function:

public static double getInf(){
   return Double.POSITIVE_INFINITY;
}

The largest possible number in Java (without using the Big classes) is also in the Double class.

double biggestNumber = Double.MAX_VALUE;

Its value is (2-2-52)*21023 or 1.7976931348623157*10308 (a.k.a. "big"). Other number classes (Integer, Long, Float, Byte, and Short) have maximum values that can be accessed in the same way.

JavaScript

JavaScript has a special global property called "Infinity": <javascript>Infinity</javascript> as well as constants in the Number class: <javascript>Number.POSITIVE_INFINITY Number.NEGATIVE_INFINITY</javascript>

The global isFinite() function tests for finiteness: <javascript>isFinite(x)</javascript>

OCaml

<ocaml>infinity</ocaml> is already a pre-defined value in OCaml.

# infinity;;
- : float = infinity
# 1.0 /. 0.0;;
- : float = infinity

Python

This is how you get infinity:

>>> float('infinity')
inf

Unfortunately, floating-point division by 0 doesn't give you infinity, but raises an exception:

>>> 1.0 / 0.0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: float division

Ruby

Infinity = 1.0/0