返回浮点数的指数值
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)
使用isfinite
和frexpf()
。
#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 会告诉您要屏蔽哪些位,但请注意,某些指数具有特殊值。
【讨论】:
以上是关于返回浮点数的指数值的主要内容,如果未能解决你的问题,请参考以下文章