解析(浮点)数字时使用了哪些信息
What information is used when parsing a (float) number?
C++的标准库在解析(浮点(数字时使用哪些信息
以下是我所知道的用std c++解析(单个(浮点数的可能性:
double atof( const char *str )
sscanf
double strtod( const char* str, char** str_end );
istringstream
、经由operator>>
或- 直接通过
num_get
很明显,至少,我们必须知道什么字符被用作小数分隔符。
iostreams,特别是num_get::get
,此外还谈到:
ios_base
I/O格式标志-这里是否有解析浮点时使用的任何信息thousands_sep
加速器(*见下文(
另一方面,在std::strtod
中,似乎是sscanf
的定义(反过来又被num_get
引用(,唯一的变量信息似乎是什么被认为是空间和十进制字符,尽管似乎没有指定是在哪里定义的。(至少在cppref和MSDN上都没有。(
那么,实际使用的信息是什么?C++标准库的有效可解析浮点表示是什么?
据我所见,只需要全局中的十进制分隔符(C
或C++
??(,此外,如果数字包含千位分隔符,我希望它只能由num_get
正确解析,因为strod
/sscanf
不支持千位分隔。
(*(组(千(分隔符对我来说是一个有趣的例子;CCD_ 18";函数不会对进行任何引用,上次我检查C
和C++
标准printf
函数时,它永远不会写入。那么,它真的是由strtod
/scanf
函数处理的吗?(我知道组分隔符有一个POSIXprintf扩展,但这并不是真正的标准,而且在微软的实现中明显缺失。(
strtod()
的C11规格似乎有一个足够大的开口,可以让任何尺寸的卡车通过。它看起来是如此开放,我认为没有限制。
§7.22.1.3 6除"C"语言环境外,还可以接受其他特定语言环境的主题序列形式。
对于非"标准C"语言环境,isspace()
、十进制(基数(点、组分隔符、每组数字和符号似乎构成了典型的变体。但显然没有限制。
为了好玩,使用printf()
、sscanf()
、strftime()
和isspace()
对500多个区域设置进行了实验。
所有测试的区域设置的基数(十进制(点为'.'
或','
,具有相同的+/-号,没有数字分组,并且预期为0-9。
strftime(... "%Y" ...)
在1000-99999年间没有使用数字分隔符。
CCD_ 33和CCD_。
0到255范围内的所有CCD_ 35值产生相同的CCD_。
当然,这些测试并不能证明对可能发生的事情的限制,但确实代表了一个可能性的样本。
- C++将浮点指针值舍入为小数位数
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 为什么在浮点中从大到小会引入更多的误差
- 我可以信任表示整数的浮点或双精度来保持精度吗
- 为什么mpfr_printf与十六进制浮点(%a转换说明符)的printf不同
- C++Lua用户数据扰乱了Mathfu浮点值
- 将CHW格式的浮点向量转换为cv::Mat
- 算术运算的结果类似于:C浮点变量中的1/3
- 格式化浮点值:返回默认值
- 浮点定向舍入和优化
- 短是浮点类型吗?
- 从VS 2015更新3更新到VS2015更新3 d后浮点计算行为不同的原因
- 使用 int 表示浮点除法 C++
- 像union_这样的 Boost.Geometry 操作如何处理浮点类型的基本不精确性?
- 浮点异常(核心转储)#694457
- 奇怪的缩小转换在 g++ 编译器中加倍到浮点警告
- C++17 十六进制浮点文字单精度后缀冲突?
- 未解析的外部符号"私有:静态浮点 对象信息::旋转
- 如何计算信息增益值以减少浮点近似误差
- 解析(浮点)数字时使用了哪些信息