从 std::fstream returns 负零中读取浮点数

Reading a float from an std::fstream returns negative zeroes

我正在尝试在 C++ 中重新实现 C# BinaryReader class 的一些方法,现在我被 ReadSingle() method 困住了。我有以下代码:

float BinaryReaderClass::ReadSingle() {
    float a;
    _inputStream->read(reinterpret_cast<char*>(&a), sizeof(a));
    return a;
}

我使用示例文件测试了我的代码,它大部分时间都有效,除了 有时 我得到负零,比如 -0.000000,而同样的函数在 C# 中 returns 0.000000.

实在想不明白为什么。

BinaryReader 没有任何不同 - 它只是将内存中的数据解释为 float,就像 reinterpret_cast.

浮点数是有符号的。与整数不同,有 两个 个零(与整数的补码一样)- 一个 -0f,另一个 +0f。但是,当您在 C# 中对 -0f 调用 ToString 时,结果是 0。另外,-0f == 0f.

区分两个零的一种方法与它们应该如何使用有关:

1f / 0f == PositiveInfinity
1f / -0f == NegativeInfinity

所以尝试在C#中获取浮点值并将其用作分母。如果它实际上是 -0f,它应该给你 NegativeInfinity 而不是 PositiveInfinity