O que exatamente significa o especificador% g printf?

O%g especificador @ parece não se comportar da maneira que a maioria das fontes o documenta como se comportand

De acordo com a maioria das fontes que encontrei, em vários idiomas que usamprintf especificadores, o%g deve ser equivalente a%f ou%e - o que produziria uma saída mais curta para o valor fornecido. Por exemplo, no momento da redação desta pergunta, cplusplus.com diz que og especificador significa:

Use a representação mais curta:%e ou%f

E a manual do @PHP diz Isso significa

g - menor de% e e% f.

And aqui está uma resposta do Stack Overflow que afirma que

%g usa a representação mais curta.

Anda Quora answer que afirma que:

%g imprime o número na menor dessas duas representações

Mas esse comportamento não é o que vejo na realidade. Se eu compilar e ru, n este programa (como C ou C ++ - é um programa válido com o mesmo comportamento em ambos):

#include <stdio.h>

int main(void) {
    double x = 123456.0;
    printf("%e\n", x);
    printf("%f\n", x);
    printf("%g\n", x);
    printf("\n");

    double y = 1234567.0;
    printf("%e\n", y);
    printf("%f\n", y);
    printf("%g\n", y);
    return 0;
}

... então eu vejo esta saída:

1.234560e+05
123456.000000
123456

1.234567e+06
1234567.000000
1.23457e+06

Claramente, o%g saída não corresponde exatamente ao a%e ou%f saída parax ouy acima. Além do mais, ele não se parece com%g também está minimizando o comprimento da saída;y poderia ter sido formatado de forma mais sucinta se, comox, tinhanãoi impresso em notação científic

Todas as fontes que eu citei acima mentem para mim?

Vejo comportamento idêntico ou semelhante em outros idiomas que suportam esses especificadores de formato, talvez porque, sob o capô, eles chamam oprintf família de funções C. Por exemplo, vejo esta saída em Python:

>>> print('%g' % 123456.0)
123456
>>> print('%g' % 1234567.0)
1.23457e+06

Em PHP:

php > printf('%g', 123456.0);
123456
php > printf('%g', 1234567.0);
1.23457e+6

In Ruby:

irb(main):024:0* printf("%g\n", 123456.0)
123456
=> nil
irb(main):025:0> printf("%g\n", 1234567.0)
1.23457e+06
=> nil

Qual é a lógica que governa essa saída?

questionAnswers(2)

yourAnswerToTheQuestion