Floating point 用浮子移动 浮动a=1.0+((浮动)(1

Floating point 用浮子移动 浮动a=1.0+((浮动)(1,floating-point,bit-manipulation,precision,bitwise-operators,byte-shifting,Floating Point,Bit Manipulation,Precision,Bitwise Operators,Byte Shifting,运行此代码后,a、b和c的浮点值是多少 当int为32位时,下面的整数移位定义良好且精确。代码不会移位浮点 与double1.0相加的是定义良好的精确和。典型的double具有53位有效位,可以精确表示0x800001.0p0。例如:DBL\u MANT\u DIG==53 // OK and exact (float) (1 << 25) (float) (1 << 26) (float) (1 << 27) 输出 float s = 0x080000

运行此代码后,a、b和c的浮点值是多少

int
为32位时,下面的整数移位定义良好且精确。代码不会移位
浮点

double
1.0相加的是定义良好的精确和。典型的
double
具有53位有效位,可以精确表示
0x800001.0p0
。例如:
DBL\u MANT\u DIG==53

// OK and exact
(float) (1 << 25)
(float) (1 << 26)
(float) (1 << 27)
输出

  float s = 0x0800001.0p0; printf("%a\n", s);
  float t = 0x1000001.0p0; printf("%a\n", t);// 0x1000001.0p0 1/2 way between two floats 
  float a = 0x2000001.0p0; printf("%a\n", a);
  float b = 0x4000001.0p0; printf("%a\n", b);
  float c = 0x8000001.0p0; printf("%a\n", c);

解释为什么a、b和c的位布局会使每个值保持原样


位布局不是问题所在。它是
FLT\u MANT\u DIG==24
float
的属性,一个24位有效位和实现定义的行为,导致
double
值四舍五入到附近的
float
一。任何
float
布局
FLT\u MANT\u DIG==24
wo你会有类似的结果。

对于家庭作业来说,这听起来是个不错的问题。问题的第一部分很容易通过运行代码来回答,因此我建议你从这一部分开始,然后思考如何解释结果。这个问题的标题是一个强烈的信号,表明你不明白自己在做什么。这不会改变
float
s,它移位
int
s.@EOF:标题或问题中没有任何内容表明
float
值或对象移位。“带浮点数移位”可能只是指涉及移位和浮点数的情况。我和朋友划船,但我没有和朋友划船。你和我在同一个班级吗?
// OK and exact
(float) (1 << 25)
(float) (1 << 26)
(float) (1 << 27)
// Let us use hexadecimal FP notation
1.0 + ((float) (1 << 25))  // 0x2000001.0p0 or 0x1.0000008p+25
1.0 + ((float) (1 << 26))  // 0x4000001.0p0 or 0x1.0000004p+26
1.0 + ((float) (1 << 27))  // 0x8000001.0p0 or 0x1.0000002p+27
  float s = 0x0800001.0p0; printf("%a\n", s);
  float t = 0x1000001.0p0; printf("%a\n", t);// 0x1000001.0p0 1/2 way between two floats 
  float a = 0x2000001.0p0; printf("%a\n", a);
  float b = 0x4000001.0p0; printf("%a\n", b);
  float c = 0x8000001.0p0; printf("%a\n", c);
0x1.000002p+23   // exact conversion double to float
0x1p+24          
0x1p+25
0x1p+26
0x1p+27