嚴格遵守 IEEE 規範
預設情況下,float
和 double
上的浮點運算不嚴格遵守 IEEE 754 規範的規則。允許表示式使用特定於實現的擴充套件來擴充套件這些值的範圍; 基本上允許它們比要求更準確。
strictfp
禁用此行為。它應用於類,介面或方法,並應用於其中包含的所有內容,例如類,介面,方法,建構函式,變數初始值設定項等。使用 strictfp
時,浮點表示式的中間值必須在 float 值設定或 double 值設定。這導致這些表示式的結果正是 IEEE 754 規範預測的結果。
所有常量表示式都是隱式嚴格的,即使它們不在 strictfp
範圍內。
因此,strictfp
的淨效應有時會使某些極端情況計算不準確,並且還會使浮點運算變慢 (因為 CPU 現在正在做更多工作以確保任何本機額外精度不會影響結果)。但是,它也會導致所有平臺上的結果完全相同。因此,它在諸如科學計劃之類的事物中是有用的,其中再現性比速度更重要。
public class StrictFP { // No strictfp -> default lenient
public strictfp float strict(float input) {
return input * input / 3.4f; // Strictly adheres to the spec.
// May be less accurate and may be slower.
}
public float lenient(float input) {
return input * input / 3.4f; // Can sometimes be more accurate and faster,
// but results may not be reproducable.
}
public static final strictfp class Ops { // strictfp affects all enclosed entities
private StrictOps() {}
public static div(double dividend, double divisor) { // implicitly strictfp
return dividend / divisor;
}
}
}