ścisłe FP

strictfp to przestarzałe i nieużywane słowo zastrzeżone w języku programowania Java . Wcześniej to słowo kluczowe było używane jako modyfikator ograniczający zmiennoprzecinkowe do semantyki IEEE 754 w celu zapewnienia przenośności. Słowo kluczowe strictfp zostało wprowadzone do języka Java wraz z wirtualną maszyną Java (JVM) w wersji 1.2, a jego funkcjonalność została usunięta w JVM w wersji 17. Od wersji Java 17 wymagana jest semantyka IEEE 754, dlatego użycie tego słowa kluczowego nie ma żadnego efektu.

Podstawa

Standard IEEE IEEE 754 określa standardową metodę zarówno obliczeń zmiennoprzecinkowych, jak i przechowywania wartości zmiennoprzecinkowych w różnych formatach, w tym single (32-bitowy, używany w Java float ) lub double (64-bitowy, używany w Java double ) precyzja.

Niektóre urządzenia zapewniają również rozszerzone formaty precyzji, które zapewniają wyższą precyzję i/lub większy zakres wykładników. W przypadku takich architektur bardziej wydajne może być obliczanie wyników pośrednich przy użyciu takich rozszerzonych formatów. Może to uniknąć błędów zaokrągleń , przepełnień i niedopełnień , które wystąpiłyby w innym przypadku, ale może spowodować, że programy będą generować różne dane wyjściowe na takich architekturach. Szczególnie kosztowne było uniknięcie stosowania rozszerzonej precyzji na maszynach x86 z tradycyjnym x87 architektura zmiennoprzecinkowa. Chociaż łatwo było kontrolować precyzję obliczeń, ograniczenie zakresu wykładników dla wyników pośrednich wymagało dodatkowych kosztownych instrukcji.

Przed JVM 1.2 obliczenia zmiennoprzecinkowe musiały być ścisłe; to znaczy, wszystkie pośrednie wyniki zmiennoprzecinkowe musiały zachowywać się tak, jakby były reprezentowane przy użyciu pojedynczej lub podwójnej precyzji IEEE. To sprawiło, że w przypadku zwykłego sprzętu opartego na architekturze x87 drogie było zapewnienie, że w razie potrzeby wystąpią przepełnienia.

Od wersji JVM 1.2 obliczenia pośrednie domyślnie mogą przekraczać standardowe zakresy wykładników związane z 32- i 64-bitowymi formatami IEEE. Zamiast tego mogą być reprezentowane jako elementy zestawu wartości „rozszerzonego wykładnika”. Na platformach takich jak x87 przepełnienia i niedopełnienia mogą nie występować tam, gdzie się tego spodziewano, dając zamiast tego prawdopodobnie bardziej znaczące, ale mniej powtarzalne wyniki.

Ponieważ x87 zmiennoprzecinkowe nie jest już potrzebne na procesorach x86 obsługujących SSE2 , Java 17 ponownie uczyniła wszystkie operacje zmiennoprzecinkowe ścisłymi, skutecznie przywracając semantykę sprzed wersji 1.2.

Jak to działa

W przypadku braku przepełnienia lub niedomiaru nie ma różnicy w wynikach ze ścisłym fp lub bez niego. Jeśli powtarzalność jest niezbędna, można użyć modyfikatora strictfp, aby upewnić się, że przepełnienie i niedopełnienie występuje w tych samych miejscach na wszystkich platformach. Bez modyfikatora strictfp wyniki pośrednie mogą wykorzystywać większy zakres wykładników.

Modyfikator strictfp realizuje to, przedstawiając wszystkie wartości pośrednie jako wartości pojedynczej i podwójnej precyzji IEEE, jak to miało miejsce we wcześniejszych wersjach JVM.

Stosowanie

Programiści mogą użyć modyfikatora strictfp , aby upewnić się, że obliczenia są wykonywane tak, jak we wcześniejszych wersjach; to znaczy tylko z używanymi typami pojedynczej i podwójnej precyzji IEEE. Stosowanie strictfp gwarantuje, że wyniki obliczeń zmiennoprzecinkowych są identyczne na wszystkich platformach.

Może być używany na klasach , interfejsach i metodach nieabstrakcyjnych . Po zastosowaniu do metody powoduje, że wszystkie obliczenia wewnątrz metody używają ścisłej matematyki zmiennoprzecinkowej. Po zastosowaniu do klasy wszystkie obliczenia wewnątrz klasy używają ścisłej matematyki zmiennoprzecinkowej. Wyrażenia stałe czasu kompilacji muszą zawsze używać ścisłego zachowania zmiennoprzecinkowego.

Przykłady

     
    
 public  strictfp  class  MyFPclass  {  // ... zawartość klasy tutaj ...  }