3

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

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

4

4 回答 4

3

这个(非平凡的)问题已经完全解决了。这个想法是打印足够多的数字,这样如果你将打印的数字转换回浮点数,你就会得到你开始的数字。

相关论文是 Robert Burger 和 R. Kent Dybvig 的“快速准确地打印浮点数”。你可以在这里下载。

于 2012-05-11T19:21:59.190 回答
1

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

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

于 2012-05-11T17:48:45.813 回答
0

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

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

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

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

于 2012-05-11T17:52:49.250 回答
0
std::cout.precision(n);

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

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

然后我的条件被评估为 5.55000 只有 5.55 将被打印

于 2012-06-03T07:47:30.760 回答