¿Qué significa exactamente el especificador% g printf?

Los%g specifier no parece comportarse de la manera en que la mayoría de las fuentes lo documentan como comportándose.

Según la mayoría de las fuentes que he encontrado, en varios idiomas que usanprintf especificadores, el%ge supone que @ especificador es equivalente a cualquiera de%f o%e - lo que produzca una salida más corta para el valor proporcionado. Por ejemplo, al momento de escribir esta pregunta, cplusplus.com dice que elg especificador significa:

Utilice la representación más corta:%e o%f

Y elPHP manual dice significa

g - más corto de%m y%.

Y Aquí hay una respuesta de desbordamiento de pila que afirma que

%g utiliza la representación más corta.

Ya respuesta de Quora que afirma que:

%g imprime el número en la más corta de estas dos representaciones

Pero este comportamiento no es lo que veo en realidad. Si compilo y ru, n este programa (como C o C ++ - es un programa válido con el mismo comportamiento en 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;
}

... entonces veo esta salida:

1.234560e+05
123456.000000
123456

1.234567e+06
1234567.000000
1.23457e+06

Claramente, el%g output no coincide conya se el%e o%f salida para cualquierax oy encima. Además, no se parece a%g también está minimizando la longitud de salida; @y podría haberse formateado de manera más sucinta si, comox, tenían ha sido impreso en notación científica.

¿Me están mintiendo todas las fuentes que he citado anteriormente?

Veo un comportamiento idéntico o similar en otros idiomas que admiten estos especificadores de formato, tal vez porque bajo el capó llaman a laprintf familia de funciones C. Por ejemplo, veo esta salida en Python:

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

En PHP:

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

En 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

¿Cuál es la lógica que gobierna esta salida?

Respuestas a la pregunta(2)

Su respuesta a la pregunta