如何确定浮点数中的最后一个非零十进制数字

How to determine the last nonzero decimal digit in a float?

本文关键字:十进制数字 最后一个 何确定 浮点数      更新时间:2023-10-16

我正在编写一个浮动打印和格式化库,并希望避免打印尾随零位。

为此,我想准确地确定小数点后前 N 位小数内的最后一个非零数字。我想知道是否有一种特别有效的方法来做到这一点。

这个(非平凡的)问题已经完全解决了。这个想法是精确地打印足够的数字,以便如果您将打印的数字转换回浮点数,您将获得您开始的数字。

相关论文是Robert Burger和R. Kent Dybvig的"快速准确地打印浮点数"。您可以在此处下载。

您必须将浮点数转换为字符串,然后修剪尾随零。

我不认为这是非常有效的,但我觉得可能没有更简单的算法

std::cout.precision(n);

其中 n 是要在小数点后显示的数字。 如果在精度限制之前但小数之后存在零, 它将自动避免。

eg. std::cout.precision(5);

然后我的分生孢子被评估为 5.55000仅打印 5.55

显而易见的解决方案是将所有数字放在一个char[N]中,并在打印前检查最后一个数字。但我敢打赌你自己也想过。

我能想到的唯一其他解决方案是2^(-n)的小数部分有n个非零数字。

因此,如果二进制表示中的最后一个非零是2^(-n),则十进制扩展中将正好有n个非零数字。因此,查看二进制表示将告诉您有关十进制表示的一些信息。

但是,这只是部分解决方案,因为舍入可能会引入额外的尾随零。

相关文章: