当我试图输出十六进制数的小数部分时,遇到了一个问题。
基本上,使用以下代码:

float d2h(float decimal, float fraction) {
  int i = 0;
  char hex[17] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
                   'A', 'B', 'C', 'D', 'E', 'F', '\0' };
  int temp = (int) decimal;
  int j;
  for (j = 0; j < 60; j++) {
    fraction = fraction - (int) fraction;
    displayFractionHex[j] = hex[(int) (fraction * 16)];
    fraction *= 16;
  }
  for (i = sizeof(displayDecimalHex) - 1; i >= 0; i--) {
    displayDecimalHex[i] = hex[temp % 16];
    temp /= 16;
  }
  int n;
  if ((n = strspn(displayDecimalHex, "0")) != 0
      && displayDecimalHex[n] != '\0')        // strspn() - Reference
    printf("%s", &displayDecimalHex[n]);
  printf(".");
  for (i = 0; i < 20; i++) {
    printf("%c", displayFractionHex[i]);
  }
}

我得到了输出222.74BC0000000000000000,我显然希望十六进制数的小数部分显示更多字符。
但是,当我尝试将最后一个printf语句改为%s说明符而不是%c时,我的程序会崩溃。
我试图将数组复制到另一个数组,不幸的是没有成功。

最佳答案

OP评论道:
预期产量大致是222.74bc6a7ef9d。。。
典型的float222.74BC000000...一样有大约24个二进制精度。
对于更高精度的使用,double
例如,使用printf("%a\n%a\n", (float) 546.456, 546.456);查看差异。

0x1.113a5ep+9
0x1.113a5e353f7cfp+9

为了清楚起见,“因此十进制浮点数是546,小数浮点数是0.456”是不正确的。d2h(float decimal)的输入不是546.456,但最接近它的可表示的float在hex-FP中正好是546.4559936523437500...

09-05 07:12