我正在尝试用 C++ 重新实现 C# BinaryReader 类的一些方法,现在我被 ReadSingle() method 困住了。 .我有以下代码:
float BinaryReaderClass::ReadSingle() {
float a;
_inputStream->read(reinterpret_cast<char*>(&a), sizeof(a));
return a;
}
我使用示例文件测试了我的代码,它在大多数情况下都能正常工作,除了有时我得到负零,如 -0.000000,而 C# 中的相同函数返回 0.000000。
我真的不明白为什么。
最佳答案
BinaryReader
没有做任何不同的事情 - 它只是将内存中的数据解释为 float
, 就像 reinterpret_cast
.
float 有符号。与整数不同,有两个 个零(与整数的补码一样)- 一个 -0f
, 另一个 +0f
.但是,当您调用 ToString
在 -0f
在 C# 中,你得到 0
因此。另外,-0f == 0f
.
区分这两个零的一种方法与它们应该如何使用有关:
1f / 0f == PositiveInfinity
1f / -0f == NegativeInfinity
于是尝试在C#中获取float值并将其作为分母。如果它实际上是 -0f
, 它应该给你 NegativeInfinity
而不是 PositiveInfinity
.
关于c# - 从 std::fstream 读取 float 返回负零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59266160/