Ciekawostki

Liczby zmiennoprzecinkowe

Popatrzmy na poniższy program:

1   program test
2   print *, 0.1e0
3   print *, 0.1e0_8
4   print *, 0.1e0_16
5   print *, 0.1e0 - 0.1e0_8
6   print *, 0.1e0 - 0.1e0_16
7   print *, 0.1e0_16 - 0.1e0_8
8   end program test

Oto wynik jego działania:

  0.100000001    
  0.10000000000000001     
   1.00000000000000000000000000000000005E-0001
   1.4901161138336505E-009
   1.49011611938476562499999999518517514E-0009
  -5.55111512312578269730333347948601193E-0018

Wnioski każdy wyciąga sam.

Stałe tekstowe

Poniżej przykład pokazujący jak można korzystać z innych kodowań: W szczególnych przypadkach można stałą tekstową poprzedzić parametrem kind-param (i znakiem podkreślenia). Do zapisu stałych tekstowych używa się kodowania ASCII. Standard nie przewiduje(?) innych rodzajów kodowania, ale może to być realizowane rozszerzenie, jak w przykładzie:

1 program character_kind
2   use iso_fortran_env
3   implicit none
4   integer, parameter :: ascii = selected_char_kind ("ascii")
5   integer, parameter :: ucs4  = selected_char_kind ('ISO_10646')
6           
7   character(kind=ascii, len=26) :: alphabet
8   character(kind=ucs4,  len=30) :: hello_world
9           
10   alphabet = ascii_"abcdefghijklmnopqrstuvwxyz"
11   hello_world = ucs4_'Hello World and Ni Hao -- ' &
12       // char (int (z'4F60'), ucs4)     &
13       // char (int (z'597D'), ucs4)
14           
15   write (*,*) alphabet
16           
17   open (output_unit, encoding='UTF-8')
18   write (*,*) trim (hello_world)
19 end program character_kind

Wynik działania tego programu jest następujący:

 abcdefghijklmnopqrstuvwxyz
 Hello World and Ni Hao -- 你好

Zwracam uwagę na konstrukcję tego programu. Po pierwsze wczytywany jest „moduł” iso_fortran_env. Później definiowane są stałe stałe całkowite integer, parameter, jedna o nazwie ascii (druga ucs4), którym nadawana jest wartość zwracana przez funkcję standardową selected_char_kind. Kolejna deklaracja zmiennej typu CHARACTER używa konstrukcję wskazywania explicite typu zmiennej (kind=). Problem zaczyna się gdy trzeba zakodować „rozszerzone” — używana jest funkcja char konwertująca wartość całkowitą zadaną jako stałą szesnastkowa, używając kodowania ucs4: char (int (z'4F60'), ucs4). Kodowanie ucs4 jest wariantem Unicode, w którym każdy znak kodowany jest na 32 bitach (czterech bajtach). Standardowo edytory i strony WWW używają kodowania UTF-8, w którym każdy znak kodowany spoza zestawu ASCII kodowany jest z użyciem zmiennej liczby bajtów (znaków).