c++ - 准确打印浮点数
问题描述
自 1990 年代以来,人们就知道如何快速准确地打印浮点数。Scheme 和 Java 编程语言已经实现了这个算法,但我在 C++ 中找不到类似的东西。
本质上,我正在寻找满足以下测试用例的一小段高效的代码:
void test(double dbl, const char *expected) {
std::string actual = ...;
assert(actual == expected);
}
test(3.0, "3.0");
test(3.1, "3.1");
test(0.1, "0.1");
test(1.0 / 3.0, "0.3333333333333333"); // Or maybe one more digit?
双精度字面量转换为浮点数,它可能与字面量相同,也可能不同。然后,浮点数被转换回字符串。此字符串应尽可能短,同时表示十进制数,当解释为双精度文字时,将再次产生相同的浮点数。
如何使用 cout 以全精度打印双精度值?看起来相关,但接受的答案中的代码不能正确处理 3.1 案例。
解决方案
您的任务可以使用std::to_chars
C++17 中出现的函数来解决:https ://en.cppreference.com/w/cpp/utility/to_chars
示例解决方案:
#include <cassert>
#include <charconv>
#include <string>
void test(double dbl, const char *expected) {
std::string actual;
actual.resize(64);
auto end = std::to_chars(actual.data(), actual.data() + actual.size(), dbl).ptr;
actual.resize(end - actual.data());
assert(actual == expected);
}
int main() {
test(3.0, "3");
test(3.1, "3.1");
test(0.1, "0.1");
test(1.0 / 3.0, "0.3333333333333333");
}
编译器资源管理器中的演示:https ://gcc.godbolt.org/z/G7zrTPKTh
推荐阅读
- debian - 将 debian 包上传到启动板 ppa 时添加了更改日志
- reactjs - 如何在变量中呈现 html 标签(或新行)?
- python - 删除 .ppm 文件的元组括号
- amazon-s3 - delta 0.8.0 与 minio S3 存储桶写入异常和有关架构实施的问题
- python - Using python pandas how can I select matched pairs to perform a matched-pair student's t-test?
- javascript - 循环中的 ES6 变量范围,内部等待
- javascript - js Date() 对象如何进行算术运算(+, - * / )?
- python - 在熊猫数据框合并中选择特定行
- jaeger - ScopeManager 在 Jaeger Opentracing 内部如何工作?
- javascript - GTM 自定义 Javascript 变量不起作用(返回函数)