Java 和 C# 之间双原始精度的差异
Difference in double primitive precision between Java & C#
This does not answer the question.
我 运行 Java & C# 中的完全相同的代码,它给出了两个不同的结果。
为什么?由于两种语言的双打具有完全相同的 specifications :
double is a type that represents 64-bit IEEE 754 floating-point number
in Java
double is a type that represents 64-bit double-precision number in
IEEE 754 format in C#.
Java
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
其根源在于浮点数是不精确的,甚至不能真正依赖于计算的确定性。但他们很接近。
很可能区别可能是因为允许 CLR 在内部使用双精度数作为 80 位数字。你不会看到超过 64 位的,但是处理器将使用 80 位。我不确定 Java 如何在内部处理浮点数。可能是一样的。
关于该主题的内容很多,但这里有一些随机的 light reading from Google 可能会引起您的兴趣。
这只是 C# 与 writeLine
方法一起使用的精度。请参阅 https://msdn.microsoft.com/en-us/library/dwhawy9k.aspx#GFormatString,其中指定 G 格式说明符提供 15 位精度。
如果你写:
Console.WriteLine(a.ToString("R"));
它打印 0.019914856674816989
.
IEEE754在必需操作和可选操作之间有区别:
- required operations,如加减法等必须四舍五入
- optional operations 不需要完全四舍五入,并且这些操作的列表包括所有三角函数(和其他函数),它们让实现
因此,您无法从标准中保证 sin
和 cos
实现在实现之间应该匹配。
This does not answer the question.
我 运行 Java & C# 中的完全相同的代码,它给出了两个不同的结果。
为什么?由于两种语言的双打具有完全相同的 specifications :
double is a type that represents 64-bit IEEE 754 floating-point number in Java
double is a type that represents 64-bit double-precision number in IEEE 754 format in C#.
Java
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
其根源在于浮点数是不精确的,甚至不能真正依赖于计算的确定性。但他们很接近。
很可能区别可能是因为允许 CLR 在内部使用双精度数作为 80 位数字。你不会看到超过 64 位的,但是处理器将使用 80 位。我不确定 Java 如何在内部处理浮点数。可能是一样的。
关于该主题的内容很多,但这里有一些随机的 light reading from Google 可能会引起您的兴趣。
这只是 C# 与 writeLine
方法一起使用的精度。请参阅 https://msdn.microsoft.com/en-us/library/dwhawy9k.aspx#GFormatString,其中指定 G 格式说明符提供 15 位精度。
如果你写:
Console.WriteLine(a.ToString("R"));
它打印 0.019914856674816989
.
IEEE754在必需操作和可选操作之间有区别:
- required operations,如加减法等必须四舍五入
- optional operations 不需要完全四舍五入,并且这些操作的列表包括所有三角函数(和其他函数),它们让实现
因此,您无法从标准中保证 sin
和 cos
实现在实现之间应该匹配。