在 C 中以高性能将 double 转换为 char\*

新手上路,请多包涵

我的应用程序需要将双精度值转换为 char* 以写入仅接受字符的管道。执行此操作的常用方法是使用 sprintf() 函数或使用 iomanip.h 头文件中的 ostringstream

事实证明,这两者的表现都非常糟糕。而且我的应用程序需要经常进行这种转换,以至于它成为主要的瓶颈。

还有其他我可以使用的功能吗?我可以使用什么逻辑来编写高效的转换函数?到目前为止,我唯一能想到的就是使用除法和 mod 操作来获取每个单独的数字,并将这些数字附加到 char* 以获得整个 double 值。不过,这似乎不是一个好方法,而且本身性能可能会很差。

提前感谢您的想法。

编辑:关于如何使用 char* 存在一些混淆。 char* 将是写入管道的 fwrite 函数的参数。

原文由 Shailesh Tainwala 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

如果您想打印 double 类型可以支持的任何数字,请使用那里的任何库来完成这项工作。它可以帮助您保持理智: 为什么“dtoa.c”包含这么多代码?

如果您想以 double 类型打印数字的子集。例如,小数点后最多4位,小数点前不超过5位,则可以将数字四舍五入并转换为int类型,然后再使用除法和mod打印出来。我可以确认这种方法的性能。


编辑: 如果您最初的目的是发送数据进行通信,那么发送 double 的二进制形式将是最快和最准确的方法(不会因转换而损失精度)。其他答案中解释了这样做的方法。

原文由 nhahtdh 发布,翻译遵循 CC BY-SA 3.0 许可协议

你能控制管道的两端吗?您只是想通过双打隧道还是需要双打的有效文本表示?

如果您只是在挖隧道并且管道清洁度为 8 位,请使用上述答案之一。

如果您需要字符串,请使用上述其他答案之一。

如果您的问题是管道只有 7 位宽,则在写入时转换为 基数 64 ,然后在读取时再次转换为基数。

原文由 Julian 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题