Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何打印IEEE754号码(不带printf)?_C_Printf_Ieee 754 - Fatal编程技术网

C 如何打印IEEE754号码(不带printf)?

C 如何打印IEEE754号码(不带printf)?,c,printf,ieee-754,C,Printf,Ieee 754,就这个问题而言,我没有能力使用printf工具(很遗憾,我无法告诉您原因,但现在让我们假设我知道我在做什么) 对于IEEE754单精度数字,您有以下位: SEEE EEEE EFFF FFFF FFFF FFFF FFFF FFFF 其中,S是符号,E是指数,F是分数 对于所有情况,打印符号都相对容易,因为可以捕获所有特殊情况,如NaN(E==0xff,F!=0)、Inf(E==0xff,F==0)和0(E==0,F==0,被认为是特殊的,因为在这种情况下没有使用指数偏差) 我有两个问题 第一

就这个问题而言,我没有能力使用
printf
工具(很遗憾,我无法告诉您原因,但现在让我们假设我知道我在做什么)

对于IEEE754单精度数字,您有以下位:

SEEE EEEE EFFF FFFF FFFF FFFF FFFF FFFF
其中,
S
是符号,
E
是指数,
F
是分数

对于所有情况,打印符号都相对容易,因为可以捕获所有特殊情况,如
NaN
E==0xff,F!=0
)、
Inf
E==0xff,F==0
)和
0
E==0,F==0
,被认为是特殊的,因为在这种情况下没有使用指数偏差)

我有两个问题


第一个是如何最好地将非规范化数字(其中
E==0,F!=0
)转换为规范化数字(其中
1非规范化数字不能转换为相同浮点类型的规范化数字)。等效规范化数字的指数太小,无法用指数表示


要打印标准化的数字,我能想到的一个愚蠢的方法是重复乘以10(好吧,对于小数部分)。

您需要做的第一件事是将指数转换为十进制(因为您可能希望输出为十进制)使用对数。取结果的分数,将尾数乘以该分数的exp10,然后将其转换为十进制字符。从这里开始,只需在适当的位置插入小数点,并按现在的十进制指数移位。

G.Steele的一篇论文更详细地描述了算法thm似乎基于与您概述的原理相同的原理。如果内存可用,有时您会被迫使用无限精度算法。(我认为这是如何准确地打印浮点数的问题,但Citeser目前已经落后于此,我无法确认,谷歌的结果也被20年后的一篇回顾性论文所污染)。

如果你想获得每次转换的准确结果,你必须使用任意精度的算法,就像printf()中所做的那样)如果你想得到“接近”的结果,可能只是它们的最低有效位不同,那么一个非常简单的基于双精度的算法就足够了:对于整数部分,重复除以10,并附加余数以形成十进制字符串(相反);对于小数部分,重复乘以10,然后减去整数部分,形成十进制字符串


我最近写了一篇关于此方法的文章:。它不打印科学符号,但添加起来应该很简单。该算法打印低于正常值的数字(我打印的数字准确无误,但您必须进行更彻底的测试).

例程可以使用任何内部表示法来表示浮点值,因此这不会是一个问题。您需要快速表示法还是任意表示法?这是一个黑暗的角落,每个角落都有微妙之处。如果您从C运行时库中提取代码并获得允许您使用的许可证,您可能会得到更好的服务。当然,可以直接转换另一个代码ion并不是很容易弄对的…这是一个。它似乎被评论得很好,但读起来并不有趣。天哪!eglibc在数学上使用GMP。GMP是我在任何情况下都拒绝使用的少数软件包之一,因为它在内存不足的情况下会严重失败,这是我觉得对于一般用途的软件包来说都是令人憎恶的图书馆。