Java和;C#
我在Java&C中运行了相同的代码,它给出了两个不同的结果 为什么??由于两种语言中的双精度符号具有完全相同的含义: double是表示64位浮点数的类型 在爪哇 double是一种表示64位双精度数字的类型 格式为C#Java和;C#,java,c#,double,precision,Java,C#,Double,Precision,我在Java&C中运行了相同的代码,它给出了两个不同的结果 为什么??由于两种语言中的双精度符号具有完全相同的含义: double是表示64位浮点数的类型 在爪哇 double是一种表示64位双精度数字的类型 格式为C# JAVA C# 其根源是浮点数不精确,计算甚至不能真正依赖于确定性。但他们很接近 最有可能的区别可能是因为CLR允许在内部使用双倍于80位的数字。您从未看到超过64位的数据,但是处理器将使用80位。我不确定Java如何在内部处理浮点数。可能是一样的 关于这个主题有很多,但这
JAVA
C#
其根源是浮点数不精确,计算甚至不能真正依赖于确定性。但他们很接近 最有可能的区别可能是因为CLR允许在内部使用双倍于80位的数字。您从未看到超过64位的数据,但是处理器将使用80位。我不确定Java如何在内部处理浮点数。可能是一样的
关于这个主题有很多,但这里有一些随机的,可能是有趣的。这只是C#在
writeLine
方法中使用的精度。请参见其中指定G格式说明符提供15位精度的地方
如果你写:
Console.WriteLine(a.ToString("R"));
它打印
0.019914856674816989
IEEE754在所需操作和可选操作之间有区别:
- ,如加法、减法等必须精确四舍五入
- 不需要精确四舍五入,并且这些操作的列表包括所有三角函数(和其他函数),它们将被用于实现
sin
和cos
实现之间应该匹配
更多信息或。我怀疑这更多是由于控制台输出将数字四舍五入,而不是基本的数学运算。你确定
Sin
和Cos
的实现是相同的吗?@realpoint一点也不确定。保罗:是的,这也是老师告诉我的,但我想有一个适当的解释。@realponsignist它似乎来自Java中的本地方法。我认为在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
Console.WriteLine(a.ToString("R"));