Liczby zmiennoprzecinkowe
Popatrzmy na poniższy program:
1 2 3 4 5 6 7 8 |
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:
1 2 3 4 5 6 |
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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
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:
1 2 |
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).