Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么C和C之间的双精度不同?_C#_C_Double Precision - Fatal编程技术网

C# 为什么C和C之间的双精度不同?

C# 为什么C和C之间的双精度不同?,c#,c,double-precision,C#,C,Double Precision,我正试图将一个旧系统的一部分重写为C#程序。用C语言编写的旧程序。这两个程序都将blob文件读入字节数组,并用数据填充对象/结构 在最初的C代码中,这是用fread()完成的 在C#中,使用二进制读取器 using(BinaryReader reader = new BinaryReader(stream)){ double1 = reader.ReadDouble(); double2 = reader.ReadDouble(); reader.BaseStream.Posit

我正试图将一个旧系统的一部分重写为C#程序。用C语言编写的旧程序。这两个程序都将blob文件读入字节数组,并用数据填充对象/结构

在最初的C代码中,这是用fread()完成的

在C#中,使用二进制读取器

using(BinaryReader reader = new BinaryReader(stream)){

  double1 = reader.ReadDouble();
  double2 = reader.ReadDouble();

  reader.BaseStream.Position = 256;

  short1 = reader.ReadInt16();
   ... and so on ...
}
大多数时候运行程序时,结果都是一样的,但有时会出现小偏差,而对于某些BLOB,则会出现大偏差

在使用insight调试C代码时,我发现从blob中提取后的值是不同的

示例
在C#中,我在C 2122566608402.68799中得到了2122566608402.688的双值
在C#中,我在C 2.33700000000001中得到了短值的2.337

这种差异的原因是什么?它是否可以修复?
在使用某些方法汇总所有条目(最多一百万条)并计算某些值后,是否会导致5%或更多的错误?
还有其他可能导致错误结果的陷阱需要注意吗?

2.33700000000001==2.337
21225608402.688==21225608402.68799
。这些字符串在解析时会导致逐位相同的
double
s
double
没有足够的精度来区分这些实数,它们都四舍五入到相同的值。精度没有差别,只是打印的数字量不同。

没有差别。在小数点后打印更多的数字,您将看到它们是相同的。二进制浮点不能准确存储大多数小数。不同之处在于打印功能决定停止的位置(在哪个数字处)。理论上,在同一台机器上运行同一个C#程序的两次运行之间甚至可能存在差异,不同之处在于数字如何转换为字符串。因此,如果我使用这些双精度值进行计算,结果应该是相同的?@user3070194计算不能很好地追溯到时间,并查看表示双精度的64位来自何处,因此是的,它应该是相同的。但是,值得注意的是,即使源代码表面上相同,您的C++和C语言程序也可能不执行完全相同的计算(W.R.T.舍入和精度)。
using(BinaryReader reader = new BinaryReader(stream)){

  double1 = reader.ReadDouble();
  double2 = reader.ReadDouble();

  reader.BaseStream.Position = 256;

  short1 = reader.ReadInt16();
   ... and so on ...
}