考虑
float num;
cin >> num;
是否明确定义了此代码可以使用的输入字符数。我特别感兴趣的是输入流可以以比num
类型可以表示的精度高得多的精度指定float
。因此,在这种情况下,它是标准化代码是否会读取所有代码(最多但不包括下一个非数字输入),或者只是最大精度为float
。
答案 0 :(得分:3)
输入在std :: num_get 22.4.2.1.2中定义:
阶段3:阶段2(字段)中累积的字符序列为 通过其中一个函数的规则转换为数值 在标题中声明:
- 对于有符号整数值,函数strtoll。
- 对于无符号整数值,函数strtoull。
- 对于浮点值,函数strtold。
要存储的数值可以是以下之一:
- 零,如果转换函数无法转换整个字段。 ios_base :: failbit分配给err。
- 最积极的可表示值,如果是字段 表示一个太大的值,无法在val中表示。 ios_base :: failbit被分配给err。
- 无符号整数类型的最负值可表示值或零,如果是字段 表示一个太大的负值,无法在val中表示。 ios_base :: failbit分配给err。
因此,流将消耗所有有效的数字模式(即使在溢出之后),并且将相应地设置状态。
答案 1 :(得分:3)
请参阅std::istream::operator>> docs中“(1)算术类型”的信息。这使用num_get::get()
以及该状态的相关文档部分“只要一个字符不能成为有效数字表达式的一部分,该函数就会停止从序列中读取字符”。
因此,从文档中可以看出所有可用的数字都会被读取,但如果浮点类型太“狭窄”,它们将不会被全部使用。
答案 2 :(得分:1)
您可以通过一些实验来测试部分内容:
#include <iostream>
int main(void) {
float f;
std::string s;
std::cin >> f;
std::cin >> s;
std::cout << f << std::endl;
std::cout << s << std::endl;
return 0;
}
然后编译:
$ g++ --version
g++ (GCC) 4.8.2
...
$ g++ -std=c++11 -pedantic -Wextra -Wall ./fltest.cpp
使用您知道的数字比float
具有更多数字的输入运行:
$ echo '3.1415926535 foo' | ./a.out
3.14159
foo
因此,似乎丢弃了无关的额外精度(单精度浮点数的精度超过7位十进制数。
您可以使用输入和输出精度来查看这些效果,例如:
std::cin.precision(7);
在std::cin >> f;
行之前,或者说:
std::cout.precision(10);
在std::cout << f;
行之前。