将双精度型转换为字符串时,第一个字符串字符是什么?

时间:2019-09-29 16:40:41

标签: c floating-point

将双精度型转换为字符串时:

static void strfromdouble(char *buf, size_t n, double d) {
    snprintf(buf, n, "%.14g", d);
}

在调用buf[0]之后,哪个字符可能会以snprintf结尾?

很明显,它可能是以下之一:0-9-.,但是由于我们在这里使用浮点数学运算,因此可能会有更多的字符结尾buf[0]类似于{{1}的IInf的{​​{1}},甚至更多?

在这种情况下,N的行为是否跨不同的编译器和平台进行了标准化?如果是,那么规范在哪里,即我在哪里可以查询我的代码在NaN中必须能够处理哪些字符?

1 个答案:

答案 0 :(得分:1)

  

将双精度型转换为字符串时,第一个字符串字符是什么?

易于生成"0123456789-+ iInN"。但是其他char也是可能的,具体取决于我们要延伸多远。

  

很明显,它可能是以下之一:0-9-.,但是由于我们在这里使用浮点数学运算,因此可能会有更多的字符结尾buf [0]类似于{{1}的IInf的{​​{1}},甚至更多?

N

NaN时,期望snprintf(buf, n, "%.14g", d);

n = 1时,期望buf[0] == '\0'保持不变,因此在这里可能任何 n = 0值。

使用buf[0]char我都不希望"%.14g"'I',而是'N''i'
'n'将产生"%.14G"'I'
这种格式不会出现前导'N'

对于其他语言环境,(研究'.'),setlocale()可能是其他东西。我不知道该怎么做。

其他格式

使用其他格式的'-'字符串:

第一个字符可以是空格"% something [gefaGefa]"' '。像'+'一样,它随 locale 的不同而不同。

如果可以使用前导'-'(我相信使用标准格式是不可能的),则其他语言环境可以使用诸如'.'之类的替代语言。


使用特定于实现的格式,任何主角字符都是可能的。

在格式无效的情况下,由于未定义的行为,任何主角字符都是可能的。


','

输出

#include <stdio.h>

int main(void) {
  char s[1000];
  double inf = strtod("inf", 0);
  double nan = strtod("nan", 0);
  snprintf(s, sizeof s, "%g\n", 0.0);   printf("%3d %.1s\n", s[0], s);
  snprintf(s, sizeof s, "%g\n", 9.0);   printf("%3d %.1s\n", s[0], s);
  snprintf(s, sizeof s, "%g\n", -1.0);  printf("%3d %.1s\n", s[0], s);
  snprintf(s, sizeof s, "%+g\n", +1.0); printf("%3d %.1s\n", s[0], s);
  snprintf(s, sizeof s, "%g\n", inf);   printf("%3d %.1s\n", s[0], s);
  snprintf(s, sizeof s, "%G\n", inf);   printf("%3d %.1s\n", s[0], s);
  snprintf(s, sizeof s, "%g\n", nan);   printf("%3d %.1s\n", s[0], s);
  snprintf(s, sizeof s, "%G\n", nan);   printf("%3d %.1s\n", s[0], s);
  snprintf(s, sizeof s, "%5g\n", 1.0);  printf("%3d %.1s\n", s[0], s);
  snprintf(s, 1, "%g\n", 1.0);          printf("%3d %.1s\n", s[0], s);
  s[0] = 'z';
  snprintf(s, 0, "%g\n", 1.0);          printf("%3d %.1s\n", s[0], s);
  return 0;
}

  

在这种情况下,snprintf的行为是否跨不同的编译器和平台进行了标准化?

是的。兼容的可能性包括 48 0 57 9 45 - 43 + 105 i 73 I 110 n 78 N 32 0 122 z 。一些编译器可能会添加其他定义的实现


  

规范(?)在哪里

查找C规范。最新的是C17

Where do I find the current C or C++ standard documents?


详细信息:

"0123456789-+ iInN"