首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是什么阻止了std::to_chars和std::from_chars的实现

是什么阻止了std::to_chars和std::from_chars的实现
EN

Stack Overflow用户
提问于 2019-09-06 16:09:09
回答 2查看 2.3K关注 0票数 18

根据support#cpp17的说法,目前还没有主要厂商支持std::to_charsstd::from_chars的浮点版本。我知道正确格式化浮点数并不简单,但是C库中存在实现。但是,这些都受到环境的影响,这是将std::to_charsstd::from_chars添加到标准中的原因之一。如果您重构C库以依赖普通的低级例程来完成实际的基本转换为某种中间格式,那么这些函数的实现就不会是免费的。然后std::to_charsstd::from_chars可以或多或少地直接使用这个结果,而C和C++中更高级别的API:s (printfatofstrtodstd::stofstd::to_string)可以做一些更奇特的事情。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-06 16:28:39

to/from_chars特性要求实现提供往返保证(自带)。具体而言,以下几点必须奏效:

代码语言:javascript
复制
float f = //get some float
char chars[LOTS_OF_CHARS];
auto result = to_chars(chars, chars + sizeof(chars), f);
float g;
from_chars(chars, result.ptr, g);
assert(f == g);

这种保证实际上是很难实现的,而且标准库C或C++浮点到字符串到浮动函数都没有提供过这种保证。因此,您不能只从printf/scanfstof/to_string获取代码,取出区域设置的内容,并将其称为to/from_chars实现。

票数 13
EN

Stack Overflow用户

发布于 2019-09-06 19:43:44

这是一半答案,一半问题:

我找到了一条关于提到需求的主题的讨论线索。

字符串表示由最小的字符组成,在基点(如果存在的话)之前至少有一个数字,并使用相应的std::from_chars函数解析该表示形式,精确地恢复值。

但C库不支持这一点。然而,如果措辞是至少正确往返所需的字符数,那么我猜

代码语言:javascript
复制
std::lock_guard l{local_mutex};
auto loc = setlocale(LC_ALL, nullptr);
setlocale(LC_ALL, "C");
char buffer[24]{};
sprintf(buffer, "%.17g", val);  // change to 9 for float
setlocale(LC_ALL, loc);

应该行得通。我说对了吗?

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57825432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档