从 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
。
我正在尝试在 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
。