【发布时间】:2021-09-29 19:04:02
【问题描述】:
是否有一些聪明而可靠的方法可以在不实际使用浮点类型的情况下将一系列位打印为 IEEE-754?
我找到了一种打印分数的方法,它允许我将浮点数表示为分数。但是,我后来意识到指数的范围可能从 -127 到 128(在调整偏差后),这可能会导致乘法 mantissa * 2^128。分数方法依赖于将分子表示为整数,我需要一个非常大的整数来进行这种乘法。我的意思是,我可以使用“自定义”类型来表示这个大值(即https://gmplib.org/),但我更愿意避免这种情况。如果我们乘以 10^x,我可以简单地调整小数点并添加一些零,但遗憾的是,情况也并非如此。
我找不到任何提及任何解决方案的内容。可能是因为谷歌搜索诸如“打印自
我为什么要这么做?
我这样做只是为了更好地理解浮点数(尤其是 IEEE-754)是如何工作的,而且我发现做一些实际示例总是有帮助的。所以我想“嘿,为什么不尝试编码呢?”。这没有实际应用(据我所知)!
【问题讨论】:
-
您可以在
float和uint32_t之间使用memcpy字节来处理表示。您还可以在float上使用%a格式说明符。 -
感谢您的提示 - 可能会这样做来玩弄它。但这与问题并不完全相关:-)
-
without actually using a float type?GCC 编译器具有 IEEE-745 类型的软件实现。 -
this question的答案可能会给你一些提示。
-
Re “有没有一些聪明可靠的方法”:有一些聪明可靠的方法很难理解,也很难实现(Ryu、Grisu3 等),还有一些简单可靠的方法易于理解且效率低下(例如,小学算术)。您只需将有效数字转换为
char数组中的十进制数字,然后按照指数的指示反复乘以或除以 2,就像小学教的那样从一个数字传到另一个数字。