C 帮助-IEEE-754-提取、规范化、NAN等
~请原谅我-C 帮助-IEEE-754-提取、规范化、NAN等,c,floating-point,C,Floating Point,~请原谅我- 我之前有一篇文章叫IEEE-754-查找符号位、指数、分形、归一化等 但是,我没有注册我的nic,我无法编辑它。(所以这个帖子对我来说基本上是死的)有人能删除它吗?我的问题也没有答案。 所以我用不同的代码发布这个 我仍然需要很多帮助。。。所以请不要把这篇文章当作复制品 我找到了符号位、指数位和尾数 我要测试什么才能找到标准化的?如果exp==0 对于无穷大,我应该测试什么?exp==0xff和mantiasa==0? 这个标志和它有关吗 我要测试什么才能找到零?exp==0
- 我之前有一篇文章叫IEEE-754-查找符号位、指数、分形、归一化等
- 我仍然需要很多帮助。。。所以请不要把这篇文章当作复制品
- 我是否有一个完成我想要的事情的顺序
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
int HexNumber;
printf("IEEE- 754 \n");
int a = 0x12345678;
unsigned char *c = (unsigned char*)(&a);
if (*c == 0x78) {
printf("\nlittle-endian\n");
} else {
printf("\nbig-endian\n");
}
printf("\n>");
scanf("%x", &HexNumber);
printf("\n%#x",HexNumber);
bool negative = !!(HexNumber & 0x80000000);
int exponent = (HexNumber & 0x7f800000) >> 23;
int mantissa = (HexNumber & 0x007FFFFF);
printf("\nsignBit %d,", negative);
printf("expbits %d,", exponent);
printf("fractbits %#x,", mantissa);
return 0;
}
如果您使用的是c99,请尝试函数
fpclassify
,该函数将返回一个枚举,说明值是否为NAN、Infinity等,以及frexp
,该函数将为您分割值
如果你想自己滚,记住无穷大和零都是有符号的。NaN由指数中的特定位模式定义,我相信尾数以非标准方式提供额外信息
通过阅读:
- 如果指数为零,尾数为非零,则该值为非规范值
- 如果指数为零,尾数为零,则值为(+/-)零
- 如果指数为最大值,尾数为零,则值为(+/-)无穷大
- 如果指数为最大值,尾数为非零,则值为NAN
fpclassify
,该函数将返回一个枚举,说明值是否为NAN、无穷大等,以及frexp
,该函数将为您分割值
如果你想自己滚,记住无穷大和零都是有符号的。NaN由指数中的特定位模式定义,我相信尾数以非标准方式提供额外信息
通过阅读:
- 如果指数为零,尾数为非零,则该值为非规范值
- 如果指数为零,尾数为零,则值为(+/-)零
- 如果指数为最大值,尾数为零,则值为(+/-)无穷大
- 如果指数为最大值,尾数为非零,则值为NAN
- 为什么不亲自验证呢
#include <stdio.h>
void extract (float x) {
union {
float value;
struct {
unsigned int frac : 23;
unsigned int exp : 8;
unsigned int sign : 1;
} fields;
} conv;
conv.value = x;
printf ("Value = %.3g,\tSign = %x,\tExp = %x,\tFrac = %x\n", x, conv.fields.sign, conv.fields.exp, conv.fields.frac);
}
int main() {
extract (1.0f); // normal number
extract (1.0f/3.0f); // normal number
extract (0.0f); // 0
extract (-0.0f); // -0
extract (1.0f / 0.0f); // inf
extract (-1.0f / 0.0f); // -inf
extract (0.0f / 0.0f); // nan
extract (1.e-40f); // denormal
extract (-1.e-42f); // denormal
return 0;
}
观察:
- 如果
=0xff,则为±inf或nan李>exp
- 如果
=0,则为inf(+或-)frac
- 如果
- 如果
≠ 0,它是nan(符号位不重要)frac
- 如果
- 如果
=0,则为零或非规范exp
- 如果
=0,则为零(+或-)frac
- 如果
- 如果
≠ 0,它是非规范(+或-)frac
- 如果
如果您使用的是C,那么在
中已经有isnan
、isnf
/isfinite
、isnormal
和signbit
用于这些测试。为什么不亲自验证呢
#include <stdio.h>
void extract (float x) {
union {
float value;
struct {
unsigned int frac : 23;
unsigned int exp : 8;
unsigned int sign : 1;
} fields;
} conv;
conv.value = x;
printf ("Value = %.3g,\tSign = %x,\tExp = %x,\tFrac = %x\n", x, conv.fields.sign, conv.fields.exp, conv.fields.frac);
}
int main() {
extract (1.0f); // normal number
extract (1.0f/3.0f); // normal number
extract (0.0f); // 0
extract (-0.0f); // -0
extract (1.0f / 0.0f); // inf
extract (-1.0f / 0.0f); // -inf
extract (0.0f / 0.0f); // nan
extract (1.e-40f); // denormal
extract (-1.e-42f); // denormal
return 0;
}
观察:
- 如果
=0xff,则为±inf或nan李>exp
- 如果
=0,则为inf(+或-)frac
- 如果
- 如果
≠ 0,它是nan(符号位不重要)frac
- 如果
- 如果
=0,则为零或非规范exp
- 如果
=0,则为零(+或-)frac
- 如果
- 如果
≠ 0,它是非规范(+或-)frac
- 如果
如果您使用的是C,那么在这些测试中已经有了
isnan
、isinf
、isnormal
和signbit
。
中的isnan
、isfinite
、isnormal
和math
(C99草稿,F.3)中的宏
与数字分类宏(FP_NAN
,FP_INFINITE
,FP_NORMAL
,FP_SUBNORMAL
,FP_ZERO
)一起使用的signbit
宏和FP_classification>宏,提供IEC 60559附录中建议的类功能设施(7.12.3中定义的分类宏不区分信令和静音NAN除外)
为了自己实现这些测试,您可以使用如下内容(对浮点值有效,从glibc源代码获取和修改):
int my\u fpclassify(uint32\u t x)
{
x&=0x7fffffff;
如果(x==0)
/*零*/
否则如果(x<0x800000)
/*次正常*/
否则如果(x>0x7f800000)
/*楠*/
else if(x==0x7f800000)
/*inf*/
其他的
/*正常的*/
}
输入我的符号位(uint32\u t x)
{
返回x&0x8000000;
}
在C99中,可以使用math.h
中的fpclassify()
和signbit()
宏(C99草稿,F.3):
与数字分类宏(FP_NAN
,FP_INFINITE
,FP_NORMAL
,FP_SUBNORMAL
,FP_ZERO
)一起使用的signbit
宏和FP_classification>宏,提供IEC 60559附录中建议的类功能设施(7.12.3中定义的分类宏不区分信令和静音NAN除外)
为了自己实现这些测试,您可以使用如下内容(对浮点值有效,从glibc源代码获取和修改):
int my\u fpclas
Value = 1, Sign = 0, Exp = 7f, Frac = 0
Value = 0.333, Sign = 0, Exp = 7d, Frac = 2aaaab
Value = 0, Sign = 0, Exp = 0, Frac = 0
Value = -0, Sign = 1, Exp = 0, Frac = 0
Value = inf, Sign = 0, Exp = ff, Frac = 0
Value = -inf, Sign = 1, Exp = ff, Frac = 0
Value = nan, Sign = 0, Exp = ff, Frac = 400000
Value = 1e-40, Sign = 0, Exp = 0, Frac = 116c2
Value = -1e-40, Sign = 1, Exp = 0, Frac = 116c2
int my_fpclassify(uint32_t x)
{
x &= 0x7fffffff;
if (x == 0)
/* zero */
else if (x < 0x800000)
/* subnormal */
else if (x > 0x7f800000)
/* nan */
else if (x == 0x7f800000)
/* inf */
else
/* normal */
}
int my_signbit(uint32_t x)
{
return x & 0x80000000;
}