如何从 std::istream 解析浮点无穷大

How to parse floating point infinity from std::istream

提问人:skalet 提问时间:2/3/2022 更新时间:2/3/2022 访问量:150

问:

我为我正在处理的一个项目编写了一个超级愚蠢的序列化库。 我刚刚被浮点无穷大咬了一口,我用下面的示例程序说明了这一点。我希望程序打印,但它会打印。 如何使用和接口修复它以给出浮点无穷大(和 NaN)的正确答案?inf -> intinf -> 0std::ostreamstd::istream

#include <limits>
#include <sstream>
#include <iostream>

void serialize(std::ostream& dst, float src) {
    dst << src;
}

void deserialize(float& dst, std::istream& src) {
    src >> dst;
}

int main() {
    const float original = std::numeric_limits<float>::infinity();
    std::stringstream buffer;
    serialize(buffer, original);
    float parsed;
    deserialize(parsed, buffer);
    std::cout << original << " -> " << parsed << '\n';
}
C++ 序列化 浮点

评论

0赞 Some programmer dude 2/3/2022
这似乎是一个错误。浮点解析使用的应该是“...解析为...std::strtof for ...”并且可以处理无穷大(而不是数字)。>>floatstd::strtof"inf""nan"
0赞 skalet 2/3/2022
我同意,这就是我所期望的。你能确认你机器上的行为吗?我用 g++ (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0 编译了程序
2赞 Some programmer dude 2/3/2022
在编译器资源管理器上测试,这似乎是 GCC 标准库实现中的一个问题。使用 libc++ 的 Clang 按预期工作。
3赞 Adrian Mole 2/3/2022
@Someprogrammerdude 报告为基础函数的LWG2381num_get
0赞 skalet 2/4/2022
该死的,这是一个很深的错误。然后我可以切换到叮当声,继续我的生活。

答: 暂无答案