OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
ieee.cpp
Go to the documentation of this file.
1//Copyright> OpenRadioss
2//Copyright> Copyright (C) 1986-2025 Altair Engineering Inc.
3//Copyright>
4//Copyright> This program is free software: you can redistribute it and/or modify
5//Copyright> it under the terms of the GNU Affero General Public License as published by
6//Copyright> the Free Software Foundation, either version 3 of the License, or
7//Copyright> (at your option) any later version.
8//Copyright>
9//Copyright> This program is distributed in the hope that it will be useful,
10//Copyright> but WITHOUT ANY WARRANTY; without even the implied warranty of
11//Copyright> MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12//Copyright> GNU Affero General Public License for more details.
13//Copyright>
14//Copyright> You should have received a copy of the GNU Affero General Public License
15//Copyright> along with this program. If not, see <https://www.gnu.org/licenses/>.
16//Copyright>
17//Copyright>
18//Copyright> Commercial Alternative: Altair Radioss Software
19//Copyright>
20//Copyright> As an alternative to this open-source version, Altair also offers Altair Radioss
21//Copyright> software under a commercial license. Contact Altair to discuss further if the
22//Copyright> commercial version may interest you: https://www.altair.com/radioss/.
23#include "hardware.inc"
24#include <cstdint>
25#include <cmath>
26
27
28extern "C" void integer_to_IEEE_ASCII(int entier,unsigned char octet[4]);
29extern "C" void IEEE_ASCII_to_integer(int *entier,unsigned char octet[4]);
30
31extern "C" void real_to_IEEE_ASCII(float reel,unsigned char octet[4]);
32extern "C" void IEEE_ASCII_to_real(float *reel,unsigned char octet[4]);
33
34extern "C" void double_to_IEEE_ASCII(double *reel,unsigned char octet[1000][8],int len);
35extern "C" void IEEE_ASCII_to_double(double *reel,unsigned char octet[1000][8],int len);
36
37
38
39void integer_to_IEEE_ASCII(int entier,unsigned char octet[4])
40{
41 octet[3] = entier & 0xff;
42 octet[2] = (entier >> 8) & 0xff;
43 octet[1] = (entier >> 16) & 0xff;
44 octet[0] = (entier >> 24) & 0xff;
45}
46
47void IEEE_ASCII_to_integer(int *entier,unsigned char octet[4])
48{
49 int result, a, b;
50 result = octet[0];
51 result = (result << 8) + octet[1];
52 result = (result << 8) + octet[2];
53 result = (result << 8) + octet[3];
54/* traitement special 64 bits */
55 if((result & 0x80000000) == 0x80000000)
56 {
57 a = (-1);
58 b = 0xFFFFFFFF;
59 result = result + a - b;
60 }
61 *entier = result;
62
63} /* fin IEEE_ASCII_to_integer */
64
65void real_to_IEEE_ASCII(float reel,unsigned char octet[4])
66{
67 int exposant,mantisse;
68 if (reel < 0. ){
69 if (reel > -1.17e-38 ){
70 /* -0. */
71 octet[0] = 0x80;
72 octet[1] = 0x00;
73 octet[2] = 0x00;
74 octet[3] = 0x00;
75 return;
76
77 } else if( reel < -3.4e+38){
78
79 /* -Infinity */
80 octet[0] = 0xff;
81 octet[1] = 0x80;
82 octet[2] = 0x00;
83 octet[3] = 0x00;
84 return;
85
86 } else {
87 mantisse = (frexp(-(double)reel,&exposant) - 0.5)*1.6777216E7;
88/* *ldexp(1.,24); */
89 exposant += 126;
90 octet[0] = (exposant & 0xfe) >> 1 | 128;
91 }
92 } else {
93 if (reel < 1.17e-38 ){
94
95 /* +0. */
96 octet[0] = 0x00;
97 octet[1] = 0x00;
98 octet[2] = 0x00;
99 octet[3] = 0x00;
100 return;
101
102 } else if( reel > 3.4e+38){
103
104 /* +Infinity */
105 octet[0] = 0x7f;
106 octet[1] = 0x80;
107 octet[2] = 0x00;
108 octet[3] = 0x00;
109 return;
110
111 } else {
112 mantisse = (frexp((double)reel,&exposant) - 0.5)*1.6777216E7;
113/* *ldexp(1.,24); */
114 exposant += 126;
115 octet[0] = (exposant & 0xfe) >> 1;
116 }
117 }
118
119 octet[1] = (exposant & 0x01) << 7 | (mantisse >> 16) & 0x7f ;
120 octet[2] = (mantisse >> 8) & 0xff ;
121 octet[3] = mantisse & 0xff ;
122
123}
124
125
126void IEEE_ASCII_to_real(float *reel,unsigned char octet[4])
127{
128 int exposant;
129 int signe;
130 double mantisse, decalage;
131
132 /* signe */
133 signe = octet[0] & 0x80;
134 if (signe==0)
135 {
136 signe = 1;
137 }
138 else
139 {
140 signe = -1;
141 } /* exposant */
142 exposant = (octet[0] & 0x7f) << 1;
143 exposant += (octet[1] & 0x80) >> 7;
144
145 if (exposant==0) /* +0. ou -0. */
146 {
147 *reel = 0.;
148 return;
149 }
150
151 exposant -= 126;
152
153 /* mantisse */
154 decalage = ldexp(1.,8);
155 mantisse = (octet[1] & 0x7f);
156 mantisse = mantisse * decalage + octet[2];
157 mantisse = mantisse * decalage + octet[3];
158 mantisse /= ldexp(1.,24);
159 mantisse += 0.5;
160
161 /* nombre */
162 *reel = (float) signe * mantisse * ldexp(1.,exposant);
163
164} /* fin IEEE_ASCII_to_real */
165
166
167
168void double_to_IEEE_ASCII(double *reel,unsigned char octet[1000][8],int len)
169{
170 int exposant,i;
171 unsigned int mantisse1, mantisse2;
172 double dmantisse;
173 for(i=0;i<len;i++)
174 {
175 if (reel[i] < 0. )
176 {
177 if (reel[i] > -4.e-308 ){ /* valeur exacte -2.22e-308 */
178 /* -0. */
179 octet[i][0] = 0x80;
180 octet[i][1] = 0x00;
181 octet[i][2] = 0x00;
182 octet[i][3] = 0x00;
183 octet[i][4] = 0x00;
184 octet[i][5] = 0x00;
185 octet[i][6] = 0x00;
186 octet[i][7] = 0x00;
187 continue;
188 } else if( reel[i] < -1.e+308){ /* valeur exacte -1.79e+308 */
189 /* -Infinity */
190 octet[i][0] = 0xff;
191 octet[i][1] = 0xf0;
192 octet[i][2] = 0x00;
193 octet[i][3] = 0x00;
194 octet[i][4] = 0x00;
195 octet[i][5] = 0x00;
196 octet[i][6] = 0x00;
197 octet[i][7] = 0x00;
198 continue;
199 } else {
200 dmantisse = (frexp(-reel[i],&exposant) - 0.5)*9.0071992547409920E15;
201/* *ldexp(1.,53) ; */
202 exposant += 1022;
203 octet[i][0] = ((exposant & 0x7ff) >> 4) | 128;
204 }
205 }
206 else
207 {
208 if (reel[i] < 4.e-308 ){ /* valeur exacte 2.22e-308 */
209 /* +0. */
210 octet[i][0] = 0x00;
211 octet[i][1] = 0x00;
212 octet[i][2] = 0x00;
213 octet[i][3] = 0x00;
214 octet[i][4] = 0x00;
215 octet[i][5] = 0x00;
216 octet[i][6] = 0x00;
217 octet[i][7] = 0x00;
218 continue;
219 } else if( reel[i] > 1.e+308){ /* valeur exacte 1.79e+308 */
220 /* +Infinity */
221 octet[i][0] = 0x7f;
222 octet[i][1] = 0xf0;
223 octet[i][2] = 0x00;
224 octet[i][3] = 0x00;
225 octet[i][4] = 0x00;
226 octet[i][5] = 0x00;
227 octet[i][6] = 0x00;
228 octet[i][7] = 0x00;
229 continue;
230
231 } else {
232 dmantisse = (frexp(reel[i],&exposant) - 0.5)*9.0071992547409920E15;
233/* *ldexp(1.,53); */
234 exposant += 1022;
235 octet[i][0] = (exposant & 0x7ff) >> 4;
236 }
237 }
238/*
239 mantisse1 = (unsigned int) (dmantisse / ldexp(1.,32));
240 mantisse2 = (unsigned int) (dmantisse - (double)mantisse1 * ldexp(1.,32));
241*/
242 mantisse1 = (unsigned int) (dmantisse / 4.294967296E9);
243 mantisse2 = (unsigned int) (dmantisse - (double)mantisse1 * 4.294967296E9);
244 octet[i][1] = ((exposant & 0x0f) << 4) | ((mantisse1 >> 16) & 0x0f);
245 octet[i][2] = (mantisse1 >> 8) & 0xff ;
246 octet[i][3] = mantisse1 & 0xff ;
247 octet[i][4] = (mantisse2 >> 24) & 0xff ;
248 octet[i][5] = (mantisse2 >> 16) & 0xff ;
249 octet[i][6] = (mantisse2 >> 8) & 0xff ;
250 octet[i][7] = mantisse2 & 0xff ;
251 } /* fin for */
252}
253/* fin double_to_IEEE_ASCII */
254
255
256void IEEE_ASCII_to_double(double *reel,unsigned char octet[1000][8],int len)
257{
258 int exposant,i;
259 int signe;
260 double mantisse, decalage;
261 for(i=0;i<len;i++)
262 {
263 /* signe */
264 signe = octet[i][0] & 0x80;
265 if (signe==0)
266 {
267 signe = 1;
268 }
269 else
270 {
271 signe = -1;
272 }
273 /* exposant */
274 exposant = (octet[i][0] & 0x7f) << 4;
275 exposant += (octet[i][1] & 0xf0) >> 4;
276
277 if (exposant==0) /* +0. ou -0. */
278 {
279 reel[i] = 0.;
280 continue;
281 }
282
283 exposant -= 1022;
284
285 /* mantisse */
286 /* decalage = ldexp(1.,8); */
287 decalage = 256.;
288 mantisse = (octet[i][1] & 0x0f);
289 mantisse = mantisse * decalage + octet[i][2];
290 mantisse = mantisse * decalage + octet[i][3];
291 mantisse = mantisse * decalage + octet[i][4];
292 mantisse = mantisse * decalage + octet[i][5];
293 mantisse = mantisse * decalage + octet[i][6];
294 mantisse = mantisse * decalage + octet[i][7];
295 /* mantisse /= ldexp(1.,53); */
296 mantisse /= 9.0071992547409920E15;
297 mantisse += 0.5;
298
299 /* nombre */
300 reel[i] = signe * mantisse * ldexp(1.,exposant);
301 } /* fin for */
302
303} /* fin IEEE_ASCII_to_double */
304
void IEEE_ASCII_to_real(float *reel, unsigned char octet[4])
Definition ieee.cpp:126
void IEEE_ASCII_to_integer(int *entier, unsigned char octet[4])
Definition ieee.cpp:47
void integer_to_IEEE_ASCII(int entier, unsigned char octet[4])
Definition ieee.cpp:39
void IEEE_ASCII_to_double(double *reel, unsigned char octet[1000][8], int len)
Definition ieee.cpp:256
void double_to_IEEE_ASCII(double *reel, unsigned char octet[1000][8], int len)
Definition ieee.cpp:168
void real_to_IEEE_ASCII(float reel, unsigned char octet[4])
Definition ieee.cpp:65