获取浮点数的符号、尾数和指数
Get the sign, mantissa and exponent of a floating point number
我找到了这段代码
#include <stdio.h>
union foo
{
struct float_guts
{
unsigned int fraction : 23;
unsigned int exponent : 8;
unsigned int sign : 1;
} fg;
float f;
};
void print_float(float f)
{
union foo ff;
ff.f = f;
printf("%f: %d 0x%X 0x%X\n", f, ff.fg.sign, ff.fg.exponent, ff.fg.fraction);
}
int main(void)
{
print_float(0.25);
return 0;
}
程序输出:
0.250000: 0 0x7D 0x0
我试着理解为提取符号、尾数和指数,但至今不明白如何
谁能给我解释一下?
联合使结构体和浮点数共享同一内存space。
代码写入 float 成员,然后读取 union 的另一个成员。它假定浮点数有一个 23 位尾数、一个 8 位指数和一个符号位,并打印它们。
NB 联合用于节省内存 space,写入一个成员并读取另一个成员是未定义的行为 - 它可能适用于某些系统,也可能不适用于其他系统。浮动映射也不是很便携。
Get the sign, mantissa and exponent of a floating point number
使用联合取决于了解 float
和 endian-ness 的格式,某些 C 未定义的内容。OP 的方法 可能 有点工作,它可能不是。如果使用 IEEE 754 OPs approach suffers from not taking into account exponent bias, not-a-numbers、sub-normal 数字等
获取签到;
#include <stdbool.h>
#include <math.h>
bool sign = signbit(x);
将 floating-point 数字分解为标准化分数和
2 的整数次幂:
#include <math.h>
int exponent;
float fraction; // [0.5f to 1.0)
fraction = frexpf(x, &exponent);
首先,了解什么是IEEE-754 Single-Precision浮点格式。简单的说,就是存储浮点数的二进制格式。对于 32 位 浮点数,它由单个 sign-bit(1 负)、8 位指数(在excess-127 表示法)和 23 位 mantissa/significand(隐藏位格式)。关于如何转换 to/from IEE754 表示法的例子数不胜数,但只要说它是计算机用来存储浮点数的 1 + 8 + 23 = 32-bit
编码就足够了。比如你的0.25
号存储为:
(0.25 float - value in memory)
0 0 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -|
|s| exp | mantissa |
或's'
、'exp'
和'mantissa'
十六进制格式:
0 0x7d 0x0
union
的整个问题与 integer
也是一个 32-bit
值这一事实有关。因此,对于每个浮点值,都有一个等效的 整数表示法 可以从上面相同的 32 位导出。 (这当然会带来 endianess 你所使用的硬件 运行 的问题,因为这些位将以不同的方式存储在内存中)
尽管如此,虽然由于评论和答案中的所有原因并不可取,但您可以在 int
(unsigned) 和 float
之间创建一个联合,这样您就可以对这些位感到满意在记忆中。例如:
typedef union {
float fv;
unsigned int iv;
} ifu;
如果您随后创建此 union
的实例并将您的 0.25
分配为浮点值,它将存储在内存中,如上所示(假设 little-endian,等等..) 例如:
ifu tmp;
tmp.fv = 0.25;
然后您可以将内存中那些完全相同的位视为 float
(您的 0.25
值)或等效的无符号整数值。一个简单的 printf
和 %u
或 0x%0x
会给你:
1048576000 0x3e800000 (in hex)
这些位完全相同,您所做的只是查看对这些位的不同解释——作为浮点数或整数。
简而言之,这就是 IEEE-754 单精度浮点、符号位、指数、尾数、并集、无符号整数等价物 -- 问题。这远不止于此,但这将为您提供一个框架来理解不同的主题。
我找到了这段代码
#include <stdio.h>
union foo
{
struct float_guts
{
unsigned int fraction : 23;
unsigned int exponent : 8;
unsigned int sign : 1;
} fg;
float f;
};
void print_float(float f)
{
union foo ff;
ff.f = f;
printf("%f: %d 0x%X 0x%X\n", f, ff.fg.sign, ff.fg.exponent, ff.fg.fraction);
}
int main(void)
{
print_float(0.25);
return 0;
}
程序输出:
0.250000: 0 0x7D 0x0
我试着理解为提取符号、尾数和指数,但至今不明白如何
谁能给我解释一下?
联合使结构体和浮点数共享同一内存space。 代码写入 float 成员,然后读取 union 的另一个成员。它假定浮点数有一个 23 位尾数、一个 8 位指数和一个符号位,并打印它们。
NB 联合用于节省内存 space,写入一个成员并读取另一个成员是未定义的行为 - 它可能适用于某些系统,也可能不适用于其他系统。浮动映射也不是很便携。
Get the sign, mantissa and exponent of a floating point number
使用联合取决于了解 float
和 endian-ness 的格式,某些 C 未定义的内容。OP 的方法 可能 有点工作,它可能不是。如果使用 IEEE 754 OPs approach suffers from not taking into account exponent bias, not-a-numbers、sub-normal 数字等
获取签到;
#include <stdbool.h>
#include <math.h>
bool sign = signbit(x);
将 floating-point 数字分解为标准化分数和 2 的整数次幂:
#include <math.h>
int exponent;
float fraction; // [0.5f to 1.0)
fraction = frexpf(x, &exponent);
首先,了解什么是IEEE-754 Single-Precision浮点格式。简单的说,就是存储浮点数的二进制格式。对于 32 位 浮点数,它由单个 sign-bit(1 负)、8 位指数(在excess-127 表示法)和 23 位 mantissa/significand(隐藏位格式)。关于如何转换 to/from IEE754 表示法的例子数不胜数,但只要说它是计算机用来存储浮点数的 1 + 8 + 23 = 32-bit
编码就足够了。比如你的0.25
号存储为:
(0.25 float - value in memory)
0 0 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -|
|s| exp | mantissa |
或's'
、'exp'
和'mantissa'
十六进制格式:
0 0x7d 0x0
union
的整个问题与 integer
也是一个 32-bit
值这一事实有关。因此,对于每个浮点值,都有一个等效的 整数表示法 可以从上面相同的 32 位导出。 (这当然会带来 endianess 你所使用的硬件 运行 的问题,因为这些位将以不同的方式存储在内存中)
尽管如此,虽然由于评论和答案中的所有原因并不可取,但您可以在 int
(unsigned) 和 float
之间创建一个联合,这样您就可以对这些位感到满意在记忆中。例如:
typedef union {
float fv;
unsigned int iv;
} ifu;
如果您随后创建此 union
的实例并将您的 0.25
分配为浮点值,它将存储在内存中,如上所示(假设 little-endian,等等..) 例如:
ifu tmp;
tmp.fv = 0.25;
然后您可以将内存中那些完全相同的位视为 float
(您的 0.25
值)或等效的无符号整数值。一个简单的 printf
和 %u
或 0x%0x
会给你:
1048576000 0x3e800000 (in hex)
这些位完全相同,您所做的只是查看对这些位的不同解释——作为浮点数或整数。
简而言之,这就是 IEEE-754 单精度浮点、符号位、指数、尾数、并集、无符号整数等价物 -- 问题。这远不止于此,但这将为您提供一个框架来理解不同的主题。