Floating point 用浮子移动 浮动a=1.0+((浮动)(1
运行此代码后,a、b和c的浮点值是多少 当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
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