Я пытаюсь напечатать __float128 с помощью libquadmath, например:
quadmath_snprintf(s, sizeof(s), "%.30Qg", f);
Со следующими тремя составами:
Выход должен соответствовать следующей продукции:
number = [ minus ] int [ frac ] [ exp ]
decimal-point = %x2E ; .
digit1-9 = %x31-39 ; 1-9
e = %x65 / %x45 ; e E
exp = e [ minus / plus ] 1*DIGIT
frac = decimal-point 1*DIGIT
int = zero / ( digit1-9 *DIGIT )
minus = %x2D ; -
plus = %x2B ; +
zero = %x30 ; 0
Учитывая, что любой вход __float128 «i», который был напечатан в строку, соответствующую вышеуказанному производственному «s», а затем «s» сканируется обратно в __float128, «j» - «i» должен быть поразрядным на «j» - т.е. никакая информация не должна быть потеряна. По крайней мере, для некоторых значений это невозможно (NaN, Infinity), каков полный список этих значений?
Не должно быть другой строки, удовлетворяющей двум вышеуказанным критериям, которая короче кандидата.
Есть ли строка формата quadmath_snprintf, которая удовлетворяет вышеуказанным требованиям (1, 3 и 2, когда это возможно)? Если так, что это?
Каковы значения __float128, которые не могут быть представлены достаточно точно, чтобы удовлетворить пункт 2 вышеуказанным производством? (например, Nan, +/- Infinity и т. д.) Как я могу определить, содержит ли __float128 одно из этих значений?