Простое использование sprintf - C

Я пытаюсь понять, почему возникает большая проблема, используя меньшую программу в качестве примера. Эта небольшая программа не работает, заставив меня поверить в то, что я понимаю недостающую функцию.

Насколько я полагал (полагаю), следующая программа должна инициализировать строку длиной до 30 символов, затем принять число "5" до девяти значимых цифр и превратить ее в эту строку. Затем программа должна распечатать значение "5.00000000". Однако программа печатает значение 7.96788 (...). Почему это?

#include <stdio.h>

int main()
{
    char word[30];
    sprintf(word, "%.9g", 5);
    printf(word);
    return 0;
}

Ответ 1

Это потому, что 5 является целым числом (int), и вы говорите sprintf, чтобы сделать вид, что это число с плавающей запятой с двойной точностью (double). Вам нужно изменить это:

sprintf(word,"%.9g", 5);

для любого из них:

sprintf(word,"%.9g", 5.0);
sprintf(word,"%.9g", (double) 5);

Ответ 2

Используйте 5.0 вместо этого. 5 сам по себе является целым числом и будет битово считать похожим на float, откуда приходит ваш 7.xxxx.

Ответ 3

Я вижу две проблемы:

  • Как уже говорили другие, вы должны указать double вместо int. У вашего компилятора может быть переключатель для печати предупреждений в этих случаях (-Wall в gcc, например).

  • Чтобы распечатать 5.00..., вы должны использовать %f вместо %g.

Это дает sprintf(word,"%.9f", (double) 5); как правильный синтаксис.

Ответ 4

Или вы можете изменить формат дескриптора: "%.9d"