【发布时间】:2012-02-21 03:32:27
【问题描述】:
我正在尝试使用 libquadmath 打印 __float128,例如:
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 是否持有这些值之一?
【问题讨论】:
-
在 __float128 中无法准确表示的十进制数是无限的。任何有效数字超过 34 位的数字。您的格式说明符会为任何 >= 1E5 的绝对数生成随机数字。您的方法存在严重缺陷,可能是从认为您需要 __float128 来解决问题开始的。
-
在 __float128 中有无数个无法准确表示的十进制数这一事实无关紧要,第 2 点仅要求十进制表示足够精确,以便在回读和四舍五入时相同就像进去的一样。我知道格式说明符不正确,问题要求正确的格式说明符。我的“方法”很好,你不知道我要解决什么问题。
标签: c gcc floating-point glibc