Java与Java之间双原语精度的差异C#

时间:2015-11-16 19:54:06

标签: java c# double precision

accumarray

我在Java&中运行了相同的代码。 C#和它给出了两个不同的结果。

为什么呢?由于两种语言的双打具有完全相同的This does not answer the question.

  

double是表示64位specifications浮点数的类型   在Java中

     

double是一种表示64位双精度数的类型   C#中的IEEE 754格式。

爪哇

double a = Math.pow(Math.sin(3), 2);
double b = Math.pow(Math.cos(3), 2);
System.out.println(a);   // 0.01991485667481699
System.out.println(b);   // 0.9800851433251829
System.out.println(a+b); // 0.9999999999999999

C#

double a = Math.Pow(Math.Sin(3), 2);
double b = Math.Pow(Math.Cos(3), 2);
Console.WriteLine(a);   // 0.019914856674817
Console.WriteLine(b);   // 0.980085143325183
Console.WriteLine(a+b); // 1

3 个答案:

答案 0 :(得分:5)

它只是C#与writeLine方法一起使用的精度。参见https://msdn.microsoft.com/en-us/library/dwhawy9k.aspx#GFormatString,其中指定G格式说明符给出15位精度。

如果你写:

Console.WriteLine(a.ToString("R"));

打印0.019914856674816989

答案 1 :(得分:0)

它的根源在于浮点数是不精确的,甚至可以依靠计算确定性。但他们已经关闭了。

很可能差异可能是因为允许CLR在内部使用双精度作为80位数。您不会看到超过64位,但处理器将使用80.我不确定Java如何在内部处理浮点数。它可能是相同的。

关于这个主题有很多,但这里有一些随机light reading from Google可能会引起关注。

答案 2 :(得分:0)

IEEE754 对所需操作和可选操作存在干扰:

  • required operations,如加法,减法等必须完全舍入
  • optional operations不需要完全舍入,这些操作的列表包括所有三角函数(和其他函数),它们被允许实现

因此,您无法保证sincos实现在实现之间应该匹配的标准。

更多信息herehere