Какая требуется точность printf, чтобы __float128 не потерял информацию?

Я пытаюсь распечатать __float128 с помощью libquadmath, например:

quadmath_snprintf(s, sizeof(s), "%.30Qg", f);

Со следующими тремя константами:

  1. Выходные данные должны соответствовать следующей продукции:

      число = [минус] int [frac] [exp]
    
    десятичная точка =% x2E; .
    
    цифра1-9 =% x31-39; 1–9
    
    е =% x65 /% x45; e E
    
    exp = e [минус / плюс] 1 * ЦИФРА
    
    frac = десятичная точка 1 * ЦИФРА
    
    int = ноль / (цифра 1-9 * ЦИФРА)
    
    минус =% x2D; -
    
    плюс =% x2B; +
    
    ноль =% x30; 0
    
  2. Для любого ввода __float128 «i», который был напечатан в строку, соответствующую указанному выше продукту «s», а затем «s» отсканирован обратно в __float128 «j» - «i» должно быть побитово идентично «j». «- т.е. никакая информация не должна быть потеряна. По крайней мере для некоторых значений это невозможно (NaN, Infinity), каков полный список этих значений?

  3. Не должно быть другой строки, удовлетворяющей двум указанным выше критериям, которая короче кандидата.

Существует ли строка формата quadmath_snprintf, которая удовлетворяет указанным выше (1, 3 и 2, когда это возможно)? Если да, то что это такое?

Какие значения __float128 не могут быть представлены достаточно точно, чтобы удовлетворить требованиям пункта 2 указанным выше производством? (например, Nan, +/- Infinity и т. д.) Как определить, содержит ли __float128 одно из этих значений?

6
задан Nico Schlömer 12 November 2019 в 15:31
поделиться