Jednym z założeń jakie przyjęli twórcy języka java była niezależność od platformy. Mamy bytecode mamy JVM-kę i jedziemy. Rzecz w tym, że we wczesnych wersjach języka wszelkie obliczenia zmiennoprzecinkowe, te na float i double, odbywały się zgodnie z normą IEEE 754 co powodowało błędy na platformach, które sobie nie radziły z tym standardem. Zatem w Javie 1.2 wprowadzono nowe słówko kluczowe strictfp i jednocześnie uwolniono dotychczasowe obliczenia od konieczności przestrzegania standardu. W efekcie na niektórych platformach stało się możliwe dokonanie pewnych optymalizacji poprzez wykorzystanie np. możliwości leżących w architekturze procesorów. Oczywiście jeżeli gdzieś pojawi się to słowo kluczowe w kodzie to wracamy do punktu wyjścia i musimy rozumieć jak działają obliczenia zgodne z IEEE 754 na danej platformie.

Jak to działa?

Zasada działania jest prosta. Możemy określić dwa zakresy działania słowa strictfp. Pierwszy na poziomie metody:

Listing 1. Zakres na poziomie metody

class MyEntity{
   
   private strictfp float add(float a, float b){
       return a + b;
   };

}

Drugi na poziomie klasy (interfejsu):

Listing 2. Zakres na poziomie klasy

strictfp class MyEntity{
   
   private float add(float a, float b){
       return a + b;
   };

}

Wszystkie obliczenia wykonywane w ramach zakresu będą zgodne z IEEE. Wszystkie oznacza w tym przypadku m.in. statyczne inicjalizatory, konstruktory, inicjowanie zmiennych.

I tu bardzo ważna uwaga. Wszystkie obliczenia wykonywane w czasie kompilacji, czyli np. wyznaczanie wartości stałej, są traktowane jako zgodne z IEEE. Przykładowo:

Listing 3. Przykładowe obliczenia traktowane jak strictfp

class MyEntity{
   
   private static final double RING_LEN = Math.PI * 2 * 1.5;

}

stała RING\_LEN zostanie wyliczona w trakcie kompilacji, a obliczenia zostaną przeprowadzone zgodnie z IEEE. Oznacza to też, że np. wartości podane w adnotacjach jako wyliczane/znane w czasie kompilacji będą traktowane zgodnie z IEEE.

Gdzie to może mieć znaczenie?

W sumie nie spotkałem się z praktycznym zastosowaniem tego rozwiązania, ale jestem wstanie wyobrazić przypadek kiedy zależy nam na tym by wraz ze zmianą platformy zachowane zostały błędy obliczeń. Po co? Ponieważ jeżeli znamy zasady obliczeń i wiemy jakie błędy będą popełnione to możemy wprowadzić poprawkę.

Jednak po prawdzie, to mało kto potrzebuje tego słówka.