Skip to content

Commit c533114

Browse files
committed
add _r16p macro
1 parent 1e463aa commit c533114

18 files changed

+121
-18
lines changed

src/lib/penf.F90

+12
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@ module penf
1616
! global parameters and variables
1717
public :: endianL, endianB, endian, is_initialized
1818
public :: ASCII, UCS4, CK
19+
#if defined _r16p
1920
public :: R16P, FR16P, DR16P, MinR16P, MaxR16P, BIR16P, BYR16P, smallR16P, ZeroR16P
21+
#endif
2022
public :: R8P, FR8P, DR8P, MinR8P, MaxR8P, BIR8P, BYR8P, smallR8P, ZeroR8P
2123
public :: R4P, FR4P, DR4P, MinR4P, MaxR4P, BIR4P, BYR4P, smallR4P, ZeroR4P
2224
public :: R_P, FR_P, DR_P, MinR_P, MaxR_P, BIR_P, BYR_P, smallR_P, ZeroR_P
@@ -129,7 +131,9 @@ subroutine penf_print(unit, pref, iostat, iomsg)
129131
write(unit=unit,fmt='(A)',iostat=iostatd,iomsg=iomsgd) prefd//' UCS4: '//str(n=UCS4)
130132
write(unit=unit,fmt='(A)',iostat=iostatd,iomsg=iomsgd) prefd//' CK: '//str(n=CK)
131133
write(unit=unit,fmt='(A)',iostat=iostatd,iomsg=iomsgd) prefd//'Reals kind, format and characters number:'
134+
#if defined _r16p
132135
write(unit=unit,fmt='(A)',iostat=iostatd,iomsg=iomsgd) prefd//' R16P: '//str(n=R16P)//','//FR16P//','//str(n=DR16P)
136+
#endif
133137
write(unit=unit,fmt='(A)',iostat=iostatd,iomsg=iomsgd) prefd//' R8P: '//str(n=R8P )//','//FR8P //','//str(n=DR8P )
134138
write(unit=unit,fmt='(A)',iostat=iostatd,iomsg=iomsgd) prefd//' R4P: '//str(n=R4P )//','//FR4P //','//str(n=DR4P )
135139
write(unit=unit,fmt='(A)',iostat=iostatd,iomsg=iomsgd) prefd//' R_P: '//str(n=R_P )//','//FR_P //','//str(n=DR_P )
@@ -139,7 +143,9 @@ subroutine penf_print(unit, pref, iostat, iomsg)
139143
write(unit=unit,fmt='(A)',iostat=iostatd,iomsg=iomsgd) prefd//' I2P: '//str(n=I2P)//','//FI2P //','//str(n=DI2P)
140144
write(unit=unit,fmt='(A)',iostat=iostatd,iomsg=iomsgd) prefd//' I1P: '//str(n=I1P)//','//FI1P //','//str(n=DI1P)
141145
write(unit=unit,fmt='(A)',iostat=iostatd,iomsg=iomsgd) prefd//'Reals minimum and maximum values:'
146+
#if defined _r16p
142147
write(unit=unit,fmt='(A)',iostat=iostatd,iomsg=iomsgd) prefd//' R16P: '//str(n=MinR16P)//','//str(n=MaxR16P)
148+
#endif
143149
write(unit=unit,fmt='(A)',iostat=iostatd,iomsg=iomsgd) prefd//' R8P: '//str(n=MinR8P )//','//str(n=MaxR8P )
144150
write(unit=unit,fmt='(A)',iostat=iostatd,iomsg=iomsgd) prefd//' R4P: '//str(n=MinR4P )//','//str(n=MaxR4P )
145151
write(unit=unit,fmt='(A)',iostat=iostatd,iomsg=iomsgd) prefd//' R_P: '//str(n=MinR_P )//','//str(n=MaxR_P )
@@ -149,7 +155,9 @@ subroutine penf_print(unit, pref, iostat, iomsg)
149155
write(unit=unit,fmt='(A)',iostat=iostatd,iomsg=iomsgd) prefd//' I2P: '//str(n=MinI2P )//','//str(n=MaxI2P)
150156
write(unit=unit,fmt='(A)',iostat=iostatd,iomsg=iomsgd) prefd//' I1P: '//str(n=MinI1P )//','//str(n=MaxI1P)
151157
write(unit=unit,fmt='(A)',iostat=iostatd,iomsg=iomsgd) prefd//'Reals bits/bytes sizes:'
158+
#if defined _r16p
152159
write(unit=unit,fmt='(A)',iostat=iostatd,iomsg=iomsgd) prefd//' R16P: '//str(n=BIR16P)//'/'//str(n=BYR16P)
160+
#endif
153161
write(unit=unit,fmt='(A)',iostat=iostatd,iomsg=iomsgd) prefd//' R8P: '//str(n=BIR8P )//'/'//str(n=BYR8P )
154162
write(unit=unit,fmt='(A)',iostat=iostatd,iomsg=iomsgd) prefd//' R4P: '//str(n=BIR4P )//'/'//str(n=BYR4P )
155163
write(unit=unit,fmt='(A)',iostat=iostatd,iomsg=iomsgd) prefd//' R_P: '//str(n=BIR_P )//'/'//str(n=BYR_P )
@@ -159,12 +167,16 @@ subroutine penf_print(unit, pref, iostat, iomsg)
159167
write(unit=unit,fmt='(A)',iostat=iostatd,iomsg=iomsgd) prefd//' I2P: '//str(n=BII2P)//'/'//str(n=BYI2P)
160168
write(unit=unit,fmt='(A)',iostat=iostatd,iomsg=iomsgd) prefd//' I1P: '//str(n=BII1P)//'/'//str(n=BYI1P)
161169
write(unit=unit,fmt='(A)',iostat=iostatd,iomsg=iomsgd) prefd//'Smallest reals'
170+
#if defined _r16p
162171
write(unit=unit,fmt='(A)',iostat=iostatd,iomsg=iomsgd) prefd//' smallR16P: '//str(smallR16P, .true.)
172+
#endif
163173
write(unit=unit,fmt='(A)',iostat=iostatd,iomsg=iomsgd) prefd//' smallR8P: '//str(smallR8P, .true.)
164174
write(unit=unit,fmt='(A)',iostat=iostatd,iomsg=iomsgd) prefd//' smallR4P: '//str(smallR4P, .true.)
165175
write(unit=unit,fmt='(A)',iostat=iostatd,iomsg=iomsgd) prefd//' smallR_P: '//str(smallR_P, .true.)
166176
write(unit=unit,fmt='(A)',iostat=iostatd,iomsg=iomsgd) prefd//'Machine zero'
177+
#if defined _r16p
167178
write(unit=unit,fmt='(A)',iostat=iostatd,iomsg=iomsgd) prefd//' ZeroR16P: '//str(ZeroR16P, .true.)
179+
#endif
168180
write(unit=unit,fmt='(A)',iostat=iostatd,iomsg=iomsgd) prefd//' ZeroR8P: '//str(ZeroR8P, .true.)
169181
write(unit=unit,fmt='(A)',iostat=iostatd,iomsg=iomsgd) prefd//' ZeroR4P: '//str(ZeroR4P, .true.)
170182
write(unit=unit,fmt='(A)',iostat=iostatd,iomsg=iomsgd) prefd//' ZeroR_P: '//str(ZeroR_P, .true.)

src/lib/penf_b_size.F90

+9-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ module penf_b_size
1212
interface bit_size
1313
!< Overloading of the intrinsic *bit_size* function for computing the number of bits of (also) real and character variables.
1414
module procedure &
15+
#if defined _r16p
1516
bit_size_R16P, &
17+
#endif
1618
bit_size_R8P, &
1719
bit_size_R4P, &
1820
bit_size_chr
@@ -25,13 +27,16 @@ module penf_b_size
2527
byte_size_I4P, &
2628
byte_size_I2P, &
2729
byte_size_I1P, &
28-
byte_size_R16p, &
30+
#if defined _r16p
31+
byte_size_R16P, &
32+
#endif
2933
byte_size_R8P, &
3034
byte_size_R4P, &
3135
byte_size_chr
3236
endinterface
3337

3438
contains
39+
#if defined _r16p
3540
elemental function bit_size_R16P(i) result(bits)
3641
!< Compute the number of bits of a real variable.
3742
!<
@@ -46,6 +51,7 @@ elemental function bit_size_R16P(i) result(bits)
4651

4752
bits = size(transfer(i, mold), dim=1, kind=I2P) * 8_I2P
4853
endfunction bit_size_R16P
54+
#endif
4955

5056
elemental function bit_size_R8P(i) result(bits)
5157
!< Compute the number of bits of a real variable.
@@ -92,6 +98,7 @@ elemental function bit_size_chr(i) result(bits)
9298
bits = size(transfer(i, mold), dim=1, kind=I4P) * 8_I4P
9399
endfunction bit_size_chr
94100

101+
#if defined _r16p
95102
elemental function byte_size_R16P(i) result(bytes)
96103
!< Compute the number of bytes of a real variable.
97104
!<
@@ -105,6 +112,7 @@ elemental function byte_size_R16P(i) result(bytes)
105112

106113
bytes = bit_size(i) / 8_I1P
107114
endfunction byte_size_R16P
115+
#endif
108116

109117
elemental function byte_size_R8P(i) result(bytes)
110118
!< Compute the number of bytes of a real variable.

src/lib/penf_global_parameters_variables.F90

+36-3
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,17 @@ module penf_global_parameters_variables
3333
integer, parameter :: CK = selected_char_kind('default') !< Default kind character.
3434
#endif
3535

36+
#if defined _r16p
3637
integer, parameter :: R16P = selected_real_kind(33,4931) !< 33 digits, range \([10^{-4931}, 10^{+4931} - 1]\); 128 bits.
38+
#endif
3739
integer, parameter :: R8P = selected_real_kind(15,307) !< 15 digits, range \([10^{-307} , 10^{+307} - 1]\); 64 bits.
3840
integer, parameter :: R4P = selected_real_kind(6,37) !< 6 digits, range \([10^{-37} , 10^{+37} - 1]\); 32 bits.
41+
#if defined _r16p
3942
#if defined _R_P_IS_R16P
4043
integer, parameter :: R_P = R16P !< Default real precision.
41-
#elif defined _R_P_IS_R8P
44+
#endif
45+
#endif
46+
#if defined _R_P_IS_R8P
4247
integer, parameter :: R_P = R8P !< Default real precision.
4348
#elif defined _R_P_IS_R4P
4449
integer, parameter :: R_P = R4P !< Default real precision.
@@ -53,12 +58,17 @@ module penf_global_parameters_variables
5358
integer, parameter :: I_P = I4P !< Default integer precision.
5459

5560
! format parameters
61+
#if defined _r16p
5662
character(*), parameter :: FR16P = '(E42.33E4)' !< Output format for kind=R16P real.
63+
#endif
5764
character(*), parameter :: FR8P = '(E23.15E3)' !< Output format for kind=R8P real.
5865
character(*), parameter :: FR4P = '(E13.6E2)' !< Output format for kind=R4P real.
66+
#if defined _r16p
5967
#if defined _R_P_IS_R16P
6068
character(*), parameter :: FR_P = FR16P !< Output format for kind=R_P real.
61-
#elif defined _R_P_IS_R8P
69+
#endif
70+
#endif
71+
#if defined _R_P_IS_R8P
6272
character(*), parameter :: FR_P = FR8P !< Output format for kind=R_P real.
6373
#elif defined _R_P_IS_R4P
6474
character(*), parameter :: FR_P = FR4P !< Output format for kind=R_P real.
@@ -78,12 +88,17 @@ module penf_global_parameters_variables
7888
character(*), parameter :: FI_PZP = FI4PZP !< Output format for kind=I_P integer with zero prefixing.
7989

8090
! length (number of digits) of formatted numbers
91+
#if defined _r16p
8192
integer, parameter :: DR16P = 42 !< Number of digits of output format FR16P.
93+
#endif
8294
integer, parameter :: DR8P = 23 !< Number of digits of output format FR8P.
8395
integer, parameter :: DR4P = 13 !< Number of digits of output format FR4P.
96+
#if defined _r16p
8497
#if defined _R_P_IS_R16P
8598
integer, parameter :: DR_P = DR16P !< Number of digits of output format FR_P.
86-
#elif defined _R_P_IS_R8P
99+
#endif
100+
#endif
101+
#if defined _R_P_IS_R8P
87102
integer, parameter :: DR_P = DR8P !< Number of digits of output format FR_P.
88103
#elif defined _R_P_IS_R4P
89104
integer, parameter :: DR_P = DR4P !< Number of digits of output format FR_P.
@@ -99,14 +114,24 @@ module penf_global_parameters_variables
99114

100115
! list of kinds
101116
integer, parameter :: CHARACTER_KINDS_LIST(1:3) = [ASCII, UCS4, CK] !< List of character kinds.
117+
#if defined _r16p
102118
integer, parameter :: REAL_KINDS_LIST(1:4) = [R16P, R8P, R4P, R_P] !< List of real kinds.
119+
#else
120+
integer, parameter :: REAL_KINDS_LIST(1:3) = [R8P, R4P, R_P] !< List of real kinds.
121+
#endif
122+
#if defined _r16p
103123
character(*), parameter :: REAL_FORMATS_LIST(1:4) = [FR16P, FR8P, FR4P//' ', FR_P] !< List of real formats.
124+
#else
125+
character(*), parameter :: REAL_FORMATS_LIST(1:3) = [FR8P, FR4P//' ', FR_P] !< List of real formats.
126+
#endif
104127
integer, parameter :: INTEGER_KINDS_LIST(1:5) = [I8P, I4P, I2P, I1P,I_P] !< List of integer kinds.
105128
character(*), parameter :: INTEGER_FORMATS_LIST(1:5) = [FI8P, FI4P, FI2P//' ', FI1P//' ', FI_P] !< List of integer formats.
106129

107130
! minimum and maximum (representable) values
131+
#if defined _r16p
108132
real(R16P), parameter :: MinR16P = -huge(1._R16P) !< Minimum value of kind=R16P real.
109133
real(R16P), parameter :: MaxR16P = huge(1._R16P) !< Maximum value of kind=R16P real.
134+
#endif
110135
real(R8P), parameter :: MinR8P = -huge(1._R8P ) !< Minimum value of kind=R8P real.
111136
real(R8P), parameter :: MaxR8P = huge(1._R8P ) !< Maximum value of kind=R8P real.
112137
real(R4P), parameter :: MinR4P = -huge(1._R4P ) !< Minimum value of kind=R4P real.
@@ -125,14 +150,18 @@ module penf_global_parameters_variables
125150
integer(I_P), parameter :: MaxI_P = huge(1_I_P) !< Maximum value of kind=I_P integer.
126151

127152
! real smallest (representable) values
153+
#if defined _r16p
128154
real(R16P), parameter :: smallR16P = tiny(1._R16P) !< Smallest representable value of kind=R16P real.
155+
#endif
129156
real(R8P), parameter :: smallR8P = tiny(1._R8P ) !< Smallest representable value of kind=R8P real.
130157
real(R4P), parameter :: smallR4P = tiny(1._R4P ) !< Smallest representable value of kind=R4P real.
131158
real(R_P), parameter :: smallR_P = tiny(1._R_P ) !< Smallest representable value of kind=R_P real.
132159

133160
! smallest real representable difference by the running calculator
161+
#if defined _r16p
134162
real(R16P), parameter :: ZeroR16P = nearest(1._R16P, 1._R16P) - &
135163
nearest(1._R16P,-1._R16P) !< Smallest representable difference of kind=R16P real.
164+
#endif
136165
real(R8P), parameter :: ZeroR8P = nearest(1._R8P, 1._R8P) - &
137166
nearest(1._R8P,-1._R8P) !< Smallest representable difference of kind=R8P real.
138167
real(R4P), parameter :: ZeroR4P = nearest(1._R4P, 1._R4P) - &
@@ -141,11 +170,15 @@ module penf_global_parameters_variables
141170
nearest(1._R_P,-1._R_P) !< Smallest representable difference of kind=R_P real.
142171

143172
! bits/bytes memory requirements
173+
#if defined _r16p
144174
integer(I2P), parameter :: BIR16P = storage_size(MaxR16P) !< Number of bits of kind=R16P real.
175+
#endif
145176
integer(I1P), parameter :: BIR8P = storage_size(MaxR8P) !< Number of bits of kind=R8P real.
146177
integer(I1P), parameter :: BIR4P = storage_size(MaxR4P) !< Number of bits of kind=R4P real.
147178
integer(I1P), parameter :: BIR_P = storage_size(MaxR_P) !< Number of bits of kind=R_P real.
179+
#if defined _r16p
148180
integer(I2P), parameter :: BYR16P = BIR16P/8_I2P !< Number of bytes of kind=R16P real.
181+
#endif
149182
integer(I1P), parameter :: BYR8P = BIR8P/8_I1P !< Number of bytes of kind=R8P real.
150183
integer(I1P), parameter :: BYR4P = BIR4P/8_I1P !< Number of bytes of kind=R4P real.
151184
integer(I1P), parameter :: BYR_P = BIR_P/8_I1P !< Number of bytes of kind=R_P real.

src/lib/penf_stringify.F90

+22
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,19 @@ module penf_stringify
3838
interface str
3939
!< Convert number (real and integer) to string (number to string type casting).
4040
module procedure &
41+
#if defined _r16p
4142
strf_R16P,str_R16P, &
43+
#endif
4244
strf_R8P ,str_R8P, &
4345
strf_R4P ,str_R4P, &
4446
strf_I8P ,str_I8P, &
4547
strf_I4P ,str_I4P, &
4648
strf_I2P ,str_I2P, &
4749
strf_I1P ,str_I1P, &
4850
str_bol, &
51+
#if defined _r16p
4952
str_a_R16P, &
53+
#endif
5054
str_a_R8P, &
5155
str_a_R4P, &
5256
str_a_I8P, &
@@ -63,7 +67,9 @@ module penf_stringify
6367
interface cton
6468
!< Convert string to number (real and integer, string to number type casting).
6569
module procedure &
70+
#if defined _r16p
6671
ctor_R16P, &
72+
#endif
6773
ctor_R8P, &
6874
ctor_R4P, &
6975
ctoi_I8P, &
@@ -75,7 +81,9 @@ module penf_stringify
7581
interface bstr
7682
!< Convert number (real and integer) to bit-string (number to bit-string type casting).
7783
module procedure &
84+
#if defined _r16p
7885
bstr_R16P, &
86+
#endif
7987
bstr_R8P, &
8088
bstr_R4P, &
8189
bstr_I8P, &
@@ -87,7 +95,9 @@ module penf_stringify
8795
interface bcton
8896
!< Convert bit-string to number (real and integer, bit-string to number type casting).
8997
module procedure &
98+
#if defined _r16p
9099
bctor_R16P, &
100+
#endif
91101
bctor_R8P, &
92102
bctor_R4P, &
93103
bctoi_I8P, &
@@ -193,6 +203,7 @@ pure function str_ucs4_ucs4(input) result(output)
193203
output = input
194204
endfunction str_ucs4_ucs4
195205

206+
#if defined _r16p
196207
elemental function strf_R16P(fm, n) result(str)
197208
!< Convert real to string.
198209
!<
@@ -207,6 +218,7 @@ elemental function strf_R16P(fm, n) result(str)
207218

208219
write(str, trim(fm)) n
209220
endfunction strf_R16P
221+
#endif
210222

211223
elemental function strf_R8P(fm, n) result(str)
212224
!< Convert real to string.
@@ -298,6 +310,7 @@ elemental function strf_I1P(fm, n) result(str)
298310
write(str, trim(fm)) n
299311
endfunction strf_I1P
300312

313+
#if defined _r16p
301314
elemental function str_R16P(n, no_sign, compact) result(str)
302315
!< Convert real to string.
303316
!<
@@ -330,6 +343,7 @@ elemental function str_R16P(n, no_sign, compact) result(str)
330343
if (compact) call compact_real_string(string=str)
331344
endif
332345
endfunction str_R16P
346+
#endif
333347

334348
elemental function str_R8P(n, no_sign, compact) result(str)
335349
!< Convert real to string.
@@ -507,6 +521,7 @@ elemental function str_bol(n) result(str)
507521
write(str, '(L1)') n
508522
endfunction str_bol
509523

524+
#if defined _r16p
510525
pure function str_a_R16P(n, no_sign, separator, delimiters, compact) result(str)
511526
!< Converting real array to string.
512527
!<
@@ -559,6 +574,7 @@ pure function str_a_R16P(n, no_sign, separator, delimiters, compact) result(str)
559574
str = trim(str(2:))
560575
if (present(delimiters)) str = delimiters(1)//str//delimiters(2)
561576
endfunction str_a_R16P
577+
#endif
562578

563579
pure function str_a_R8P(n, no_sign, separator, delimiters, compact) result(str)
564580
!< Convert real array to string.
@@ -1034,6 +1050,7 @@ elemental function strz_I1P(n, nz_pad) result(str)
10341050
if (present(nz_pad)) str=str(DI1P-nz_pad:DI1P-1) ! Leaving out the extra zeros padding
10351051
endfunction strz_I1P
10361052

1053+
#if defined _r16p
10371054
function ctor_R16P(str, knd, pref, error) result(n)
10381055
!< Convert string to real.
10391056
!<
@@ -1057,6 +1074,7 @@ function ctor_R16P(str, knd, pref, error) result(n)
10571074
endif
10581075
if (present(error)) error = err
10591076
endfunction ctor_R16P
1077+
#endif
10601078

10611079
function ctor_R8P(str, knd, pref, error) result(n)
10621080
!< Convert string to real.
@@ -1202,6 +1220,7 @@ function ctoi_I1P(str, knd, pref, error) result(n)
12021220
if (present(error)) error = err
12031221
endfunction ctoi_I1P
12041222

1223+
#if defined _r16p
12051224
elemental function bstr_R16P(n) result(bstr)
12061225
!< Convert real to string of bits.
12071226
!<
@@ -1221,6 +1240,7 @@ elemental function bstr_R16P(n) result(bstr)
12211240
buffer = transfer(n, buffer)
12221241
write(bstr, '(16B8.8)') buffer
12231242
endfunction bstr_R16P
1243+
#endif
12241244

12251245
elemental function bstr_R8P(n) result(bstr)
12261246
!< Convert real to string of bits.
@@ -1322,6 +1342,7 @@ elemental function bstr_I1P(n) result(bstr)
13221342
write(bstr, '(B8.8)') n
13231343
endfunction bstr_I1P
13241344

1345+
#if defined _r16p
13251346
elemental function bctor_R16P(bstr, knd) result(n)
13261347
!< Convert bit-string to real.
13271348
!<
@@ -1339,6 +1360,7 @@ elemental function bctor_R16P(bstr, knd) result(n)
13391360
read(bstr, '(16B8.8)') buffer
13401361
n = transfer(buffer, n)
13411362
endfunction bctor_R16P
1363+
#endif
13421364

13431365
elemental function bctor_R8P(bstr, knd) result(n)
13441366
!< Convert bit-string to real.
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
#if defined _r16p
12
program volatile_doctest
23
use penf_b_size
34
use penf
45
print FI2P, bit_size(1._R16P)
5-
endprogram volatile_doctest
6+
endprogram volatile_doctest
7+
#endif
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
#if defined _r16p
12
program volatile_doctest
23
use penf_b_size
34
use penf
45
print FI1P, byte_size(1._R16P)
5-
endprogram volatile_doctest
6+
endprogram volatile_doctest
7+
#endif

0 commit comments

Comments
 (0)