如何确定浮点数中的最后一个非零十进制数字
How to determine the last nonzero decimal digit in a float?
我正在编写一个浮动打印和格式化库,并希望避免打印尾随零位。
为此,我想准确地确定小数点后前 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
个非零数字。因此,查看二进制表示将告诉您有关十进制表示的一些信息。
但是,这只是部分解决方案,因为舍入可能会引入额外的尾随零。
相关文章:
- 我必须更改我的数字最后一个数字和第一个数字,但不要使用仅带有整数或循环的函数.例如从 12345 到 52341
- 带有文件结束函数的 while 循环重复输出文件中的最后一个数字两次
- 递归推动POP POSTFIX计算器无法正确执行操作,只需将最后一个数字作为结果
- 代码问题.使用矢量删除相同的数字,除了它的最后一个入口
- C++:对数组进行排序,最后一个数字重复两次
- C++ - 查找数组中第一个和最后一个负数之间的数字
- 我不想要最后一个数字/值后面的逗号,如何删除它(c ++,循环)
- 如何删除C++中浮点数的最后一个有效数字/尾数位
- 逐行计算文件:EOF 重复最后一个数字(不能使用中断)
- 如何确定浮点数中的最后一个非零十进制数字
- 为什么我可以索引到数字超出范围的三维数组中,但仍然可以访问数组中的最后一个数字
- 编写一个宏is_digit,如果其参数是十进制数字,则返回true
- 无法显示 for 循环后的最后一个数字
- 不能算出这个按数字顺序打印数字的c++小程序的最后一个
- 查找升序列表中降序的第一个和最后一个数字
- 冒泡排序不排序最后一个数字与此算法
- 排序程序仅显示第一个和最后一个数字
- 如何在读取文本文件时跳到每行最后一个数字之后的下一行
- 为什么 C++ 中的编译器不增加循环中最后一个数字的值?
- 把最后一个数字切掉,做成双份