我已经查明了它的作用,但是有没有人真的有一个例子,你何时会strictfp在Java中使用关键字?有没有人真的找到了这个用途?
将它放在我的所有浮点运算上是否会产生任何副作用?
显然java.lang.StrictMath包含其他功能(双曲线等)java.lang.Math但没有,但两个库中的功能是否存在差异?
如果我们在控制台应用程序上执行以下C#代码,我们将收到一条消息The sums are Not equal.
如果我们在取消注释该行后执行它System.Console.WriteLine(),我们将收到一条消息The sums are equal.
static void Main(string[] args)
{
float f = Sum(0.1f, 0.2f);
float g = Sum(0.1f, 0.2f);
//System.Console.WriteLine("f = " + f + " and g = " + g);
if (f == g)
{
System.Console.WriteLine("The sums are equal");
}
else
{
System.Console.WriteLine("The sums are Not equal");
}
}
static float Sum(float a, float b)
{
System.Console.WriteLine(a + b);
return a + b;
}
Run Code Online (Sandbox Code Playgroud)
这种行为的实际原因是什么?
JEP 306在 Java 17 中实现,提供始终严格的浮点语义,弃用该strictfp标志。这是否意味着java.lang.Math可以指望其行为与 中的类似方法完全相同StrictMath(即,该java.lang.Math方法不能再被 JVM 替换为过去所允许的内在函数)?这是否也意味着无论使用哪个库,不同架构之间的浮点数学结果不应再有任何差异?
我很好奇我是否误解了新的 Java 17 功能,因为我们确实看到 Apple Silicon 与 Intel 之间今天的代码存在差异。