将定点/浮点数打印为十六进制

问题描述 投票:0回答:1

在我的通用库中添加了将定点数字打印为十六进制的功能,并且意识到我不是%100知道我应该如何表示数字的小数部分。快速的Google搜索建议我应该:

  1. 乘以16
  2. 将整数部分转换为十六进制并将其添加到缓冲区中
  3. 去除整数部分
  4. 重复

如此处建议https://bytes.com/topic/c/answers/219928-how-convert-float-hex

[在纸上测试此方法后,我注意到某些分数(即。7),这导致。B3333的重复模式,依此类推。在我看来,这是非常不可取的。我还想知道,如果我尝试将其从字符串读取为定点格式,是否会导致精度下降。

有人为什么不像其他十六进制数字那样打印分数部分吗?即17535.564453打印为447F.89CE5

的地方

也许这两种方法还有另一种选择。有什么想法吗?

c math floating-point ieee-754 fixed-point
1个回答
0
投票

由于浮点数在内部是二进制的,所以不能精确表示0.7。这样您就不会得到无限的重复。您将得到准确的53位(14个十六进制数字为4 * 14 = 56位,所以这是限制)。实际上,将浮点数写为十六进制的主要原因是获得真实值的精确表示。

将十六进制的十进制分数好像是一个整数本质上是没有意义的(例如,您丢掉了多少个前导零?),即使您将数字写为0x447F + 0x89CE5 / 0xF4240,实际上也不会捕获精确值,该精确值是分母为2的幂的分数。

© www.soinside.com 2019 - 2024. All rights reserved.