C++ 用C+读取浮点+;输入运算符

C++ 用C+读取浮点+;输入运算符,c++,input,floating-point,floating-point-conversion,C++,Input,Floating Point,Floating Point Conversion,考虑 float num; cin >> num; 是否定义了此代码可以使用的输入字符数。我特别感兴趣的是,输入流的num指定精度可能比float类型所能表示的精度高得多。因此,在这种情况下,代码是读取所有数据(最多但不包括下一个非数字输入),还是仅读取最大精度的float,这是标准化的。您可以通过一个小实验来测试其中的一部分: #include <iostream> int main(void) { float f; std::string s;

考虑

float num;
cin >> num;

是否定义了此代码可以使用的输入字符数。我特别感兴趣的是,输入流的
num
指定精度可能比
float
类型所能表示的精度高得多。因此,在这种情况下,代码是读取所有数据(最多但不包括下一个非数字输入),还是仅读取最大精度的
float

,这是标准化的。您可以通过一个小实验来测试其中的一部分:

#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;
}
并使用您知道的比浮点数多的输入运行:

$ echo '3.1415926535 foo' | ./a.out
3.14159
foo
因此,似乎多余的额外精度被丢弃了(一个单精度浮点数的精度略高于7位小数)

您可以通过输入和输出精度来查看它们的效果,例如:

std::cin.precision(7);
std::cin>>f;
行之前,或者说:

std::cout.precision(10);

在std::cout之前,输入在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)算术类型”的信息。这将使用
num\u get::get()
和文档中用于该状态的相关部分“当一个字符不能成为有效数字表达式的一部分时,函数将停止从序列中读取字符”


因此,从文档中可以看出,所有可用数字都将被读取,但如果浮点类型太“窄”,则不会全部使用这些数字。

谢谢,这非常有用。现在我陷入困境,因为我有两个正确答案:)曾尝试过类似的测试,但想知道这是否是一个定义良好的行为,我可以信赖。结果表明,它确实是定义好的。不仅仅是它是否放弃了额外的精度(它必须,浮点不能代表它们)关注运算符消耗多少输入。它最多消耗不能作为浮点文本一部分的第一个字符。
std::cout.precision(10);