Floating point 1在C/C+中是如何编码的+;作为浮点(假设IEEE 754单精度表示)?
我的印象是C float有8位指数和23位尾数 所以一个是00111111000000=0x3F800000 但是,以下代码生成的是1.06535e+09,而不是1。 有人能帮我理解为什么吗Floating point 1在C/C+中是如何编码的+;作为浮点(假设IEEE 754单精度表示)?,floating-point,ieee-754,Floating Point,Ieee 754,我的印象是C float有8位指数和23位尾数 所以一个是00111111000000=0x3F800000 但是,以下代码生成的是1.06535e+09,而不是1。 有人能帮我理解为什么吗 #include <iostream> #include <math.h> using namespace std; int main() { float i = 0x3F800000; cout<<i << endl; ret
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
float i = 0x3F800000;
cout<<i << endl;
return 0;
}
#包括
#包括
使用名称空间std;
int main()
{
浮点数i=0x3F800000;
库特
1在C中是如何编码为浮点数的
谁能帮我理解为什么(代码失败)
与i=1065353216
相同
在C语言中,要覆盖位模式,请使用联合
或memcpy()
在C++中,建议<代码> MycPyIE()< <代码> > < /P>
使用强制转换有可能由于抗锯齿而失败
#包括
#包括
_静态断言(sizeof(float)=sizeof(uint32_t),“意外类型”);
内部主(空){
联合{
uint32_t u;
浮动f;
}x={.u=0x3f800000};
浮动f=x.f;
printf(“%e\n”,f);
返回0;
}
在不太常见的系统上,这可能由于以下原因而失败:
float
不可用
float/uint32
使用IEEE-754,浮点数1写为:
0 01111111 00000000000000000000000 (base-2) = 3f80 0000 (base-16)
因此,您的假设是正确的。不幸的是,0x3f800000
表示的位模式不能通过以下操作分配给浮点:
float a = 0x3f800000
十六进制数将首先转换为一个无符号整数,该整数的值为10进制的1065353216
。然后该数字将隐式转换为最接近的浮点数
因此,简而言之,虽然IEEE-754浮点数的位模式是正确的,但您对如何分配此模式的假设是不正确的。请看看如何实现这一点,或者看看这个问题的其他答案。我很确定您没有将该位模式分配给I
,而是分配给特定的整数。我正在尝试你知道为什么你认为00111111000000
或0x3F800000
应该等于1。你能解释一下这背后的思维过程吗?这不是标准的IEEE表示法吗?看这里虽然我多年没有用过C,但我一直认为float
和double的具体表示法代码>取决于目标体系结构,而不是C标准。我的印象不正确吗?@EricJ。看起来是这样。它将十六进制转换为无符号整数,将无符号整数转换为浮点。如何直接将十六进制分配给浮点?
0 01111111 00000000000000000000000 (base-2) = 3f80 0000 (base-16)
float a = 0x3f800000