【发布时间】:2021-12-18 14:29:34
【问题描述】:
我输入了以下 C 代码:
typedef unsigned char* byte_pointer;
void show_bytes(byte_pointer start, size_t len)
{
int i;
for (i = 0; i < len; i++)
printf(" %.2x", start[i]);
printf("\n");
}
void show_float(float x)
{
show_bytes((byte_pointer) &x, sizeof(float));
}
void main()
{
float f = 3.9;
show_float(f);
}
这段代码的输出是: 输出:0x4079999A
手动计算 1.1111001100110011001100 x 2 次方 1
男:1111001100110011001100
E:1 + 127 = 128(d) = 10000000(b)
最终位:01000000011110011001100110011000
十六进制:0x40799998
为什么最后一个 A 显示为 8。
【问题讨论】:
-
如果你有
float f = 3.9f;会发生什么?您的3.9是double值。请注意,3.9 无法精确转换为有限二进制浮点表示,因此实现细节将涵盖近似值是向上舍入还是向下舍入。 -
最好不要
typedef指针。 -
@WeatherVane:应该不会有太大变化。双 3.9 值的浮点截断很可能是浮点值 3.9f。我假设多精度表示应该是
0x4079999999999...。这通常四舍五入到更接近的可表示浮点值0x4079999A。问题是哪个手动计算会导致0x40799998... -
@SergeBallesta 是的,在实践中我发现没有区别。一条已删除的评论质疑人工计算的依据;)
-
@WeatherVane:仅供参考,the shortest decimal numeral that differs when converted first to a
doubleand then afloathas seven significant digits,除了标志之外,只有一个。
标签: c floating-point hex