2000-03-09 18:31:51 +00:00
|
|
|
/**********************************************************************
|
|
|
|
*
|
2001-02-04 08:21:35 +00:00
|
|
|
* ieee-float.h
|
2000-03-09 18:31:51 +00:00
|
|
|
*
|
|
|
|
* Implements simple stuff to convert from IEEE float types
|
|
|
|
* to 32-bit longs
|
|
|
|
*
|
|
|
|
* (C) Ashok Narayanan, 2000
|
|
|
|
*
|
2001-02-04 08:21:35 +00:00
|
|
|
* $Id: ieee-float.h,v 1.2 2001/02/04 08:21:35 guy Exp $
|
2000-03-09 18:31:51 +00:00
|
|
|
*
|
|
|
|
* For license details, see the COPYING file with this distribution
|
|
|
|
*
|
|
|
|
**********************************************************************/
|
|
|
|
|
|
|
|
#ifndef IEEE_FLOAT_H
|
|
|
|
#define IEEE_FLOAT_H
|
|
|
|
|
|
|
|
/* Stuff for IEEE float handling */
|
|
|
|
|
|
|
|
#define IEEE_NUMBER_WIDTH 32 /* bits in number */
|
|
|
|
#define IEEE_EXP_WIDTH 8 /* bits in exponent */
|
|
|
|
#define IEEE_MANTISSA_WIDTH 23 /* IEEE_NUMBER_WIDTH - 1 - IEEE_EXP_WIDTH */
|
|
|
|
|
|
|
|
#define IEEE_SIGN_MASK 0x80000000
|
|
|
|
#define IEEE_EXPONENT_MASK 0x7F800000
|
|
|
|
#define IEEE_MANTISSA_MASK 0x007FFFFF
|
|
|
|
#define IEEE_INFINITY IEEE_EXPONENT_MASK
|
|
|
|
|
|
|
|
#define IEEE_IMPLIED_BIT (1 << IEEE_MANTISSA_WIDTH)
|
|
|
|
#define IEEE_INFINITE ((1 << IEEE_EXP_WIDTH) - 1)
|
|
|
|
#define IEEE_BIAS ((1 << (IEEE_EXP_WIDTH - 1)) - 1)
|
|
|
|
|
|
|
|
#define MINUS_INFINITY (signed)0x80000000L
|
|
|
|
#define PLUS_INFINITY 0x7FFFFFFF
|
|
|
|
|
|
|
|
static inline int ieee_float_is_zero (long number)
|
|
|
|
{
|
|
|
|
return(!(number & ~IEEE_SIGN_MASK));
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* simple conversion: ieee floating point to long
|
|
|
|
*/
|
2001-02-04 08:21:35 +00:00
|
|
|
static long tvb_ieee_to_long (tvbuff_t *tvb, int offset)
|
2000-03-09 18:31:51 +00:00
|
|
|
{
|
|
|
|
long number;
|
|
|
|
long sign;
|
|
|
|
long exponent;
|
|
|
|
long mantissa;
|
|
|
|
|
2001-02-04 08:21:35 +00:00
|
|
|
number = tvb_get_ntohl(tvb, offset);
|
2000-03-09 18:31:51 +00:00
|
|
|
sign = number & IEEE_SIGN_MASK;
|
|
|
|
exponent = number & IEEE_EXPONENT_MASK;
|
|
|
|
mantissa = number & IEEE_MANTISSA_MASK;
|
|
|
|
|
|
|
|
if (ieee_float_is_zero(number)) {
|
|
|
|
/* number is zero, unnormalized, or not-a-number */
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
if (IEEE_INFINITY == exponent) {
|
|
|
|
/* number is positive or negative infinity, or a special value */
|
|
|
|
return (sign? MINUS_INFINITY: PLUS_INFINITY);
|
|
|
|
}
|
|
|
|
|
|
|
|
exponent = (exponent >> IEEE_MANTISSA_WIDTH) - IEEE_BIAS;
|
|
|
|
if (exponent < 0) {
|
|
|
|
/* number is between zero and one */
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
mantissa |= IEEE_IMPLIED_BIT;
|
|
|
|
if (exponent <= IEEE_MANTISSA_WIDTH)
|
|
|
|
mantissa >>= IEEE_MANTISSA_WIDTH - exponent;
|
|
|
|
else
|
|
|
|
mantissa <<= exponent - IEEE_MANTISSA_WIDTH;
|
|
|
|
|
|
|
|
if (sign)
|
|
|
|
return -mantissa;
|
|
|
|
else
|
|
|
|
return mantissa;
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|