返回浮点数的指数值

Posted

技术标签:

【中文标题】返回浮点数的指数值【英文标题】:Returning the exponent value of a floating point number 【发布时间】:2014-03-03 07:54:20 【问题描述】:

如何只返回浮点数的指数部分?它是单精度的,所以我需要得到八个指数位的值。

int floatExp(float f)  
 //Return the exponent value for f. return tmax if f is nan or infinity

【问题讨论】:

您在寻找frexp吗? (frexpf 用于浮动) 【参考方案1】:

提取二进制指数的标准方法是使用math.h 中的frexp() 函数。见http://www.csse.uwa.edu.au/programming/ansic-library.html#float

如果需要十进制指数,请使用math.h中的log10()函数。

【讨论】:

或者将 (freexp(x,&m)*3)/10 的值用作 log10 的廉价且几乎准确的替代品【参考方案2】:

代码当然应该传递float 而不是unsigned

// int floatExp(unsigned f)
int floatExp(float f)

使用isfinitefrexpf()

#include <math.h>
int floatExp2(float value) 
  int exp;
  if (isfinite(value)) 
    frexpf(&exp);
    return exp;
  
  return tmax;

对于以 10 为底的,需要做更多的工作。

#include <math.h>
int floatExp10_(float value) 
  if (isfinite(value)) 
    if (value == 0.0) return 0;
    float exp = log10f(fabsf(value));

    // use floorf() rather than `(int) exp`.  
    // This does the proper rounding when `exp` is + or -
    return (int) floorf(exp);
  
  return tmax;

C 确实没有定义浮点也没有float 有“八个指数位”。它也没有定义指数是二进制的。许多实现使用IEEE 754 single-precision binary floating-point format: binary32,它确实有一个 8 位的 2 次幂偏置指数。

一种破解方法是使用联合。这种不可移植的方法高度依赖于了解浮点格式、整数大小、浮点数和整数的字节序。以下或其变体可能在 OP 的环境中工作。

int floatExp_hack(float value) 
  if (isfinite(value)) 
    union 
      float f;
      value unsigned long ul;
     u;
    assert(sizeof u.f == sizeof u.ul);
    u.f = value;
    return (u.ul >> 23) & 0xFF;
  
  return tmax;

【讨论】:

【参考方案3】:

记录任何你有兴趣获取指数的基数。

只有在您的平台使用 IEEE 浮点数时,才可以使用比特,但不能保证这一点。 Wikipedia's article on single precision IEEE floating points 会告诉您要屏蔽哪些位,但请注意,某些指数具有特殊值。

【讨论】:

以上是关于返回浮点数的指数值的主要内容,如果未能解决你的问题,请参考以下文章

ieee754单精度浮点数 表示方法

如何在没有指数表示法的情况下将浮点数作为字符串获取?

php数值转换函数

MODBUS RTU协议中浮点数是如何存储,读到浮点数寄存器的数值如何转换成所需的浮点数

FORTRAN里怎样把数值类型(整数,浮点数)转换为字符串

浮点数剖析