问题标签 [strictfp]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Java strictfp 修饰符对现代 CPU 有影响吗?
strictfp
根据 JLS,我知道修饰符对方法(和类)的含义:
strictfp 修饰符的作用是使方法主体内的所有浮点或双精度表达式都显式地为 FP-strict(第 15.4 节)。
在 FP-strict 表达式中,所有中间值必须是 float 值集或 double 值集的元素,这意味着所有 FP-strict 表达式的结果必须是 IEEE 754 算术对使用单双格式表示的操作数预测的结果.
在非 FP 严格的表达式中,允许实现使用扩展指数范围来表示中间结果;粗略地说,最终效果是,在独占使用浮点值集或双精度值集可能导致上溢或下溢的情况下,计算可能会产生“正确答案”。
我一直在尝试想出一种方法来获得方法中的表达式与非strictfp
方法中的表达式之间的实际差异strictfp
。我在两台笔记本电脑上试过这个,一台配备 Intel Core i3 CPU,另一台配备 Intel Core i7 CPU。而且我看不出任何区别。
许多帖子表明,不使用的本机浮点数strictfp
可能使用 80 位浮点数,并且在可能的最小 java double(最接近零)或最高可能的 64 位 java double 之上具有额外的可表示数字。
我在下面尝试了使用和不使用strictfp
修饰符的代码,它给出了完全相同的结果。
实际上,我认为只有在将代码编译为汇编时才会出现任何差异,因此我使用-Xcomp
JVM 参数运行它。但没有区别。
我发现另一篇文章解释了如何获取 HotSpot 生成的汇编代码(OpenJDK 文档)。我正在运行我的代码java -Xcomp -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly
。第一个v * 1.0000001 / 1.0000001
带有修饰符的表达式 ( ) 和没有修饰符的表达式strictfp
相同,编译为:
该代码中没有任何内容可以像我预期的那样将每个步骤的结果截断为 64 位。查找 和 的 文档,他们都提到这些(SSE)指令在 64 位浮点值上运行,而不是我预期的 80 位值。因此,这些指令操作的双值集已经是 IEEE 754 值集似乎是合乎逻辑的,因此拥有和不拥有它没有区别。movsd
mulsd
divsd
strictfp
我的问题是:
- 这个分析正确吗?我不经常使用英特尔组件,所以我对我的结论没有信心。
- 是否有任何(其他)现代 CPU 架构(具有 JVM)在使用和不使用
strictfp
修饰符的操作之间存在差异?
java - Java 的 % 运算符是否会溢出?
根据Shafik 的帖子,在 C 和 C++ 中, 的行为 INT_MIN % -1
似乎是未定义的/平台相关的。
在 Java 中,% 运算符是否会溢出?
考虑这段代码:
上述结果是否有独立于平台的保证0
?
java - strictfp 类的访问级别和默认类的访问级别一样吗?
我在不同的包中有以下 2 个类:
当然,如果我将超类设为public ,则可以访问它,但是当我将其设为 strictfp (只是为了知道它支持什么访问级别)时,我得到以下错误:
SuperClass 类型不可见。
那么我可以说strictfp具有与default相同的访问级别吗?
这是我阅读它的屏幕截图。
java - 为什么 Eclipse 要求在枚举中声明 strictfp
我正在尝试 Java 中的枚举类型。当我写下面的课程时,
编译器说:Syntax error on token String, strictfp expected.
我知道是什么,strictfp
但它会来这里吗?
java - 如何在方法中使用 strictfp 关键字?
我知道strictfp
关键字可以应用于方法、类和接口。
java - 如果不使用 strictfp,代码是否会以某种方式变得不合规?
我们即将进行第一次代码审计,有人告诉我,不使用strictfp
浮点运算可能会让我们被标记。软件在 Windows 机器上编码并部署到 Solaris 机器以供生产使用。关于它是真的有什么建议吗?
另外,如果不使用'strictfp'会使浮点算术代码不兼容或不可移植,为什么仍然允许以非strictfp方式进行计算?
CERT 安全编码标准,NUM53-J让我觉得必须使用strictfp
:
需要跨不同 JVM 和平台的浮点运算获得一致结果的程序必须使用 strictfp 修饰符。
java - Strictfp 在不同的系统上返回不同的结果
我在 Windows 8 (Intel Atom Z3775) 上使用以下方法:
这给了我:1.80000592E8
跑步时
我得到:1.8000059E8
为什么它们不同?我使用 strictfp 错了吗?
java - 实现/扩展接口/类时 strictfp 关键字的行为
strictfp 修饰符的作用是使接口声明中的所有浮点或双精度表达式显式地为 FP-strict(第 15.4 节)。
这意味着接口中声明的所有嵌套类型都是隐式的 strictfp。
strictfp 修饰符的作用是使接口声明中的所有浮点或双精度表达式显式地为 FP-strict(第 15.4 节)。
这意味着接口中声明的所有方法,以及接口中声明的所有嵌套类型,都是隐式的 strictfp。
从这两段中没有迹象表明strictfp
在实现/扩展使用strictfp
修饰符声明的接口/类时的行为。
经过搜索,我找到了一个很好的解释strictfp
关键字的用法使用 strictfp 修饰符实现跨平台的浮点计算一致性,它指定:
扩展 FP-strict 超类的子类不会继承严格行为。当被覆盖的方法不是时,覆盖方法可以独立选择是 FP 严格的,反之亦然。
我strictfp
在扩展用关键字声明的类时测试了关键字的行为strictfp
,这是真的:strictfp
行为不是由扩展类的类继承,但问题是在实现用strictfp
关键字声明的接口时它不正确:strictfp
行为不是由实现的类继承界面。
谁能解释我strictfp
实现/扩展使用strictfp
修饰符声明的接口/类的正确行为?
java - 为什么 strictfp 应运而生?
我一直阅读strictfp将浮点计算限制为IEEE-754标准,但从未读过为什么他们需要根据该标准限制计算结果?
java - 将 `float` 转换为 `double` 时我应该使用 `strictfp` 修饰符吗?
如果我想编写从 float 转换为 double 的方法。
有没有任何情况下两者会给出不同的结果?
如果我不关心平台一致性,我应该使用哪个版本?
如果我需要它在不同平台上表现一致怎么办?
或者:
JLS 5.1.2:
从 float 到 double 的扩展原始转换不是 strictfp 可能会丢失有关转换值的整体大小的信息。
为什么此转换会丢失信息?