__float128需要什么样的printf精度才能丢失信息?

And*_*zos 6 c floating-point gcc glibc

我正在尝试使用libquadmath打印__float128,例如:

quadmath_snprintf(s, sizeof(s), "%.30Qg", f);
Run Code Online (Sandbox Code Playgroud)

有以下三个constaints:

  1. 输出必须符合以下生产:

     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
    
    Run Code Online (Sandbox Code Playgroud)
  2. 给定任何输入__float128"i"已经打印到匹配上述生产"s"的字符串,然后"s"被扫描回到__float128"j" - "i"必须与"j"按位相同 - 即不应丢失任何信息.对于至少某些值,这是不可能的(NaN,Infinity),这些值的完整列表是什么?

  3. 应该没有其他字符串满足上述两个标准,比候选人短.

是否有满足上述要求的quadmath_snprintf格式字符串(尽可能为1,3和2)?如果是这样的话是什么?

__float128的值是什么,无法通过上述生产准确表示以满足第2点?(例如Nan,+/ - Infinity等)如何检测__float128是否持有其中一个值?

jan*_*neb 2

如果您使用的是 x86,则 GCC __float128 类型是 IEEE 754-2008 二进制 128 格式的软件实现。IEEE 754 标准要求,如果字符表示形式包含 36 个有效(十进制)数字,则二进制 -> 字符 -> 二进制往返可以恢复原始值。因此格式字符串%.36Qg应该可以做到这一点。

不需要 NaN 往返恢复原始按位值。

至于您的要求#3,libquadmath 不包含这种“最短表示”格式的代码,例如本着 Steele 和白皮书的精神或 David Gay 的代码。