为什么双重精度在C和C#之间有所不同?

  发布于 2023-01-09 13:28

我正在尝试将旧系统的一部分重写为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#中我得到2.337在C 2.3370000000000001为短值

造成这种差异的原因是什么,是否可以解决?
在一些方法总结所有条目(高达一百万)并计算一些值后,这是否会导致5%或更多的错误?是否还有其他需要注意的陷阱,可能会导致错误的结果?

1 个回答
  • 2.3370000000000001 == 2.337212256608402.688 == 212256608402.68799.这些字符串在double解析时会导致逐位相同的s.double没有足够的精度来区分这些实数,它们都被四舍五入到相同的值.精度没有差异,只有打印位数的差异.

    2023-01-09 13:31 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有