And*_*zos 6 c floating-point gcc glibc
我正在尝试使用libquadmath打印__float128,例如:
quadmath_snprintf(s, sizeof(s), "%.30Qg", f);
Run Code Online (Sandbox Code Playgroud)
有以下三个constaints:
输出必须符合以下生产:
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)给定任何输入__float128"i"已经打印到匹配上述生产"s"的字符串,然后"s"被扫描回到__float128"j" - "i"必须与"j"按位相同 - 即不应丢失任何信息.对于至少某些值,这是不可能的(NaN,Infinity),这些值的完整列表是什么?
应该没有其他字符串满足上述两个标准,比候选人短.
是否有满足上述要求的quadmath_snprintf格式字符串(尽可能为1,3和2)?如果是这样的话是什么?
__float128的值是什么,无法通过上述生产准确表示以满足第2点?(例如Nan,+/ - Infinity等)如何检测__float128是否持有其中一个值?
如果您使用的是 x86,则 GCC __float128 类型是 IEEE 754-2008 二进制 128 格式的软件实现。IEEE 754 标准要求,如果字符表示形式包含 36 个有效(十进制)数字,则二进制 -> 字符 -> 二进制往返可以恢复原始值。因此格式字符串%.36Qg应该可以做到这一点。
不需要 NaN 往返恢复原始按位值。
至于您的要求#3,libquadmath 不包含这种“最短表示”格式的代码,例如本着 Steele 和白皮书的精神或 David Gay 的代码。
| 归档时间: |
|
| 查看次数: |
3160 次 |
| 最近记录: |