用C ++输入操作符读取float

时间:2014-03-11 03:09:04

标签: c++ input floating-point floating-point-conversion

考虑

float num;
cin >> num;

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

3 个答案:

答案 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;行之前。