我正在尝试将旧系统的一部分重写为C#程序。旧程序用C语言编写。两个程序都将blob文件读入一个字节数组,并用数据填充一个object / struct。
在原始C代码中,这是通过fread()
完成的fread(&myStruct, sizeof(MYSTRUCT), 1, data)
fseek(data, 256, 0)
fread(&nextStruct, sizeof(NEXTSTRUCT), 1, data)
在C#中使用二进制阅读器
using(BinaryReader reader = new BinaryReader(stream)){
double1 = reader.ReadDouble();
double2 = reader.ReadDouble();
reader.BaseStream.Position = 256;
short1 = reader.ReadInt16();
... and so on ...
}
在大多数情况下运行程序时,结果是相同的,但有时存在小的偏差,对于某些blob,存在巨大的偏差。
在用洞察力调试C代码的过程中,我发现从blob中提取后的值并不相同。
实例
在C#中我得到212256608402. 688 在C 212256608402中。 68799 用于双倍值
在C#中,对于短值,我在C 2.3370000000000001得到2.337
造成这种差异的原因是什么?它是否可以解决? 在一些方法总结所有条目(高达一百万)并计算一些值后,这是否会导致5%或更多的错误? 是否还有其他需要注意的陷阱,可能会导致错误的结果?
答案 0 :(得分:7)
2.3370000000000001 == 2.337
和212256608402.688 == 212256608402.68799
。解析时,这些字符串会导致逐位相同的double
s。 double
没有足够的精度来区分这些实数,它们都被四舍五入到相同的值。精度没有差异,只是打印的数字不同。