Jordi GutiƩrrez Hermoso wrote:
On 15 August 2010 17:04, Rik <address@hidden> wrote:
During the coding I came across a need to know the largest integer that
would fit within a given data class. This was easy for the integer classes
(intmax("CLASS")) and for doubles there is bitmax(). Is there equivalent
functionality for singles?
Why not wrap C++'s <limits> header?
#include <iostream>
#include <limits>
using namespace std;
int main()
{
cout << "Max float: " << numeric_limits<float>::max() << endl;
}
You can use is_iec559 if you want to ensure that float is 4 bytes,
although I can't imagine that anyone would be using a non-IEEE754
implementation of C++ for compiling Octave. I would expect that there
are already several assumptions in Octave sources that
numeric_limits<float>::is_iec559 is true.
It would appear that you are right about assumptions. I looked up the
existing bitmax code in bitfcns.cc:526 and I find
retval = (static_cast<double> (0x1FFFFFFFFFFFFFLL));
which is surely a hard-coded constant. On the other hand, configure checks
and adds compiler flags for IEEE754 behavior so perhaps you're right that
we are guaranteed IEEE754 conformance.
The <limits> code doesn't quite work as it determines the largest floating
point value that <float> can hold and I need the largest integer that
<float> can hold. For that I need the number of bits in the mantissa of
the representation.
So, rephrasing the question. Is there any issue with extending bitmax to
include a class argument and having the default for single be 24 bits of
precision. (See
http://en.wikipedia.org/wiki/Floating_point#IEEE_754:_floating_point_in_modern_computers)
--Rik