我正在尝试使用lib44数学打印一个__float128,例如:
quadmath_snprintf(s, sizeof(s), "%.30Qg", f);有以下三项条件:
数字=减去整数,小数点= %x2E;数字1-9 = %x31-39;1-9 e= %x65 / %x45;e exp =e-/+1*数字框架=小数点1*位int =0/(数字化1-9*数字)减= %x2D;- plus = %x2B;+零= %x30;0
。
是否有满足上述条件的quadmath_snprintf格式字符串(如果可能的话,则为1、3和2)?如果是这样,那又是什么呢?
__float128的值有哪些不能被精确地表示,以满足上述产品的第2点?(例如Nan,+/-Infinity等)如何检测__float128是否持有这些值之一?
发布于 2012-01-28 21:47:11
如果您在x86上,那么GCC __float128类型是IEEE754-2008 binary128格式的软件实现。IEEE754标准要求,如果字符表示包含36个有效(十进制)数字,则二进制-> char ->二进制往返将恢复原始值。因此,格式字符串%.36Qg应该这样做。
不需要NaN往返恢复原始按位计算的值。
至于您的需求#3,lib44不包含这种“最短表示”格式的代码,例如,基于Steele &白皮书的精神或David的代码。
发布于 2012-01-28 19:25:18
我的直觉告诉我,二进制分数0.1111.1(128个1);也等于1-1/2**128在转换为十进制时会产生最大的溢出数。将这个值转换为十进制(我现在没有一个bignum包),数数数字的数目,在上面加上2-3,你应该是安全的。不过,我没有数学证据证明这就足够了。
如果I/O的精度很重要,我更愿意将浮点数作为十六进制字符串输出。准确的浮点IO是很难得到正确的,在这方面,图书馆可能是错误的。
https://stackoverflow.com/questions/9045243
复制相似问题