为什么mpfr_printf与printf的十六进制浮点数(%a转换说明符)不同?

sdpoll

我正在比较常规浮点算法的值,并使用高精度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将它们解析为相同的值,但是我找不到任何说明它们为何不同的文档。

哪一个是规范的?

埃里克·波斯蒂奇(Eric Postpischil)

没有规范形式。C标准不规范第一位数字,只是对于正常数字它必须为非零。C 2018 7.21.6.1 8说,aandA转换说明符:

表示浮点数参数被转换在样式[ - ] 0xh.hhhhp±d 那里是一个十六进制数(其是非零如果参数是归一化的浮点数且为未指定的)前小数点字符及其后的十六进制位数等于精度;…

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

可移植的printf格式说明符,用于64位十六进制?

PHP将十六进制转换为浮点数

将十六进制转换为浮点数

将浮点数转换为十六进制格式

为什么printf的%m格式说明符输出“成功”?

为什么不推荐使用带有单个参数(没有转换说明符)的printf?

为什么十六进制格式说明符在VS2013中为x86产生错误的输出

在Javascript中将64位十六进制转换为十进制浮点数

Python如何将浮点数十六进制转换为十进制

为什么printf显示十六进制数字的错误值

使用十六进制格式说明符进行打印

如何将十六进制转换为浮点数

C ++将4个十六进制值转换为浮点数

如何在python中将十六进制值转换为浮点数

将十六进制字符串转换为浮点数

如何在Perl中将浮点数转换为十六进制字符串?

将十六进制转换为C中的浮点数

如何在 Node.js 中将 4 字节十六进制转换为浮点数

十六进制转换为浮点数-JS中的Big Endian(ABCD)

将数字(也可以是浮点数)转换为十六进制,反之亦然

Float24(24位浮点数)转换为十六进制?

如何在 VB.NET 中将浮点数转换为十六进制?

将十六进制文件转换为php中的浮点数

如何使用 C# 将十六进制转换为浮点数

打印浮点数的内部十六进制

将浮点数表示为十六进制

“ p”在浮点数的指数十六进制表示法中代表什么

Printf宽度说明符可保持浮点值的精度

为什么与printf中的转换说明符不匹配的参数会出现未定义的行为?