Mało znane słowa kluczowe – strictfp

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.

4 myśli na temat “Mało znane słowa kluczowe – strictfp

  1. Ostatnimi czasy dowiedziałem się o takim mało optymalnym, wprowadzającym w błąd mykiem:

    List arr = new ArrayList(){{

    add(5);
    add(6);

    }};

  2. blablabla, tyle to i ja wiem – dajże jakiś przykład gdzie coś faktycznie może się różnić!

  3. Ło panie… musiałbym chyba poszukać jakiegoś nietypowego procka z końca lat 90-tych, żeby pokazać tą różnicę. Generalnie jak pisałem obecnie to mało używany element, bo został wprowadzony by kompensować różnice pomiędzy platformami.

Napisz odpowiedź

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax