我正在比较常规浮点算法的值,并使用高精度MPFR数作为基线。打印时,我很困惑为什么以下代码输出不同。
该MPFR文件说,输出说明符
C99风格的'a''A'十六进制浮点数”
因此,我认为它的打印结果与相同printf
。然而,这种情况并非如此:
#include <boost/multiprecision/mpfr.hpp>
#include <mpfr.h>
using namespace boost::multiprecision;
int main (int argc, char* argv[])
{
double a = 254.5;
mpfr_float_1000 mpfr_a = 254.5;
mpfr_t t;
mpfr_init2(t, 3324); // 1000 decimal precision
mpfr_set_d(t, a, MPFR_RNDN);
printf("double:\t%a\n", a);
mpfr_printf("mpfr_t:\t%RNa\n", t);
mpfr_printf("boost:\t%RNa\n", mpfr_a);
}
给出输出:
double: 0x1.fdp+7
mpfr_t: 0xf.e8p+4
boost: 0xf.e8p+4
这不是什么大问题,因为sscanf
将它们解析为相同的值,但是我找不到任何说明它们为何不同的文档。
哪一个是规范的?
没有规范形式。C标准不规范第一位数字,只是对于正常数字它必须为非零。C 2018 7.21.6.1 8说,a
andA
转换说明符:
甲双表示浮点数参数被转换在样式[ - ] 0xh.hhhhp±d ,那里是一个十六进制数(其是非零如果参数是归一化的浮点数且为未指定的)前小数点字符及其后的十六进制位数等于精度;…
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句