@@ -288,26 +288,120 @@ float ffmath::rCbrt( float x )
288
288
/* ============================================================================*/
289
289
float ffmath::rounding ( float x )
290
290
{
291
- x += 12582912 .0F ;
292
- x -= 12582912 .0F ;
293
- return x;
291
+ int32_t i0 = 0 , j0 ;
292
+ float ret = x;
293
+
294
+ cast_reinterpret ( i0, x );
295
+ /* cstat -MISRAC++2008-5-0-21 -MISRAC++2008-2-13-3 -ATH-neg-check-nonneg -ATH-shift-neg -CERT-INT34-C_c*/
296
+ j0 = ( ( i0 >> 23 ) & 0xFF ) - 0x7F ;
297
+ if ( j0 < 23 ) {
298
+ if ( j0 < 0 ) {
299
+ i0 &= static_cast <int32_t >( 0x80000000 );
300
+ if ( -1 == j0 ) {
301
+ i0 |= 0x3F800000 ;
302
+ }
303
+ cast_reinterpret ( ret, i0 );
304
+ }
305
+ else {
306
+ const int32_t i = 0x007FFFFF >> j0 ;
307
+ if ( 0 != ( i0 & i ) ) {
308
+ i0 += 0x00400000 >> j0 ;
309
+ i0 &= ~i;
310
+ cast_reinterpret ( ret, i0 );
311
+ }
312
+ }
313
+ }
314
+ /* cstat +MISRAC++2008-5-0-21 +MISRAC++2008-2-13-3 +ATH-neg-check-nonneg +ATH-shift-neg +CERT-INT34-C_c*/
315
+ return ret;
294
316
}
295
317
/* ============================================================================*/
296
318
float ffmath::floor ( float x )
297
319
{
298
- return ffmath::rounding ( x - 0 .5F );
320
+ int32_t i0 = 0 , j0 ;
321
+ float ret = x;
322
+
323
+ cast_reinterpret ( i0, x );
324
+ /* cstat -MISRAC++2008-5-0-21 -MISRAC++2008-2-13-3 -ATH-neg-check-nonneg -ATH-shift-neg -CERT-INT34-C_c*/
325
+ j0 = ( ( i0 >> 23 ) & 0xFF ) - 0x7F ;
326
+ if ( j0 < 23 ) {
327
+ if ( j0 < 0 ) {
328
+ if ( i0 >= 0 ) {
329
+ i0 = 0 ;
330
+ }
331
+ else if ( 0 != ( i0 & 0x7FFFFFFF ) ) {
332
+ i0 = static_cast <int32_t >( 0xBF800000 );
333
+ }
334
+ else {
335
+ /* nothing to do here*/
336
+ }
337
+ cast_reinterpret ( ret, i0 );
338
+ }
339
+ else {
340
+ const int32_t i = ( 0x007FFFFF ) >> j0 ;
341
+ if ( 0 != ( i0 & i ) ) {
342
+ if ( i0 < 0 ) {
343
+ i0 += 0x00800000 >> j0 ;
344
+ }
345
+ i0 &= (~i);
346
+ cast_reinterpret ( ret, i0 );
347
+ }
348
+ }
349
+ }
350
+ /* cstat +MISRAC++2008-5-0-21 +MISRAC++2008-2-13-3 +ATH-neg-check-nonneg +ATH-shift-neg +CERT-INT34-C_c*/
351
+ return ret;
299
352
}
300
353
/* ============================================================================*/
301
354
float ffmath::ceil ( float x )
302
355
{
303
- return ffmath::rounding ( x + 0 .5F );
356
+ int32_t i0 = 0 , j0 ;
357
+ float ret = x;
358
+
359
+ cast_reinterpret ( i0, x );
360
+ /* cstat -MISRAC++2008-5-0-21 -MISRAC++2008-2-13-3 -ATH-neg-check-nonneg -ATH-shift-neg -CERT-INT34-C_c*/
361
+ j0 = ( ( i0 >> 23 ) & 0xFF ) - 0x7F ;
362
+ if ( j0 < 23 ) {
363
+ if ( j0 < 0 ) {
364
+ if ( i0 < 0 ) {
365
+ i0 = static_cast <int32_t >( 0x80000000 );
366
+ }
367
+ else if ( 0 != i0 ) {
368
+ i0 = static_cast <int32_t >( 0x3F800000 );
369
+ }
370
+ else {
371
+ /* nothing to do here*/
372
+ }
373
+ cast_reinterpret ( ret, i0 );
374
+ }
375
+ else {
376
+ const int32_t i = ( 0x007FFFFF ) >> j0 ;
377
+ if ( 0 != ( i0 & i ) ) {
378
+ if ( i0 > 0 ) {
379
+ i0 += 0x00800000 >> j0 ;
380
+ }
381
+ i0 &= (~i);
382
+ cast_reinterpret ( ret, i0 );
383
+ }
384
+ }
385
+ }
386
+ /* cstat +MISRAC++2008-5-0-21 +MISRAC++2008-2-13-3 +ATH-neg-check-nonneg +ATH-shift-neg +CERT-INT34-C_c*/
387
+ return ret;
304
388
}
305
389
/* ============================================================================*/
306
390
float ffmath::trunc ( float x )
307
391
{
308
- /* cstat -CERT-FLP34-C -CERT-FLP36-C*/
309
- return static_cast <float >( static_cast <int32_t >( x ) );
310
- /* cstat +CERT-FLP34-C +CERT-FLP36-C*/
392
+ int32_t i0 = 0 , sx, j0 ;
393
+ float ret = x;
394
+
395
+ cast_reinterpret ( i0, x );
396
+ /* cstat -MISRAC++2008-5-0-21 -MISRAC++2008-2-13-3 -ATH-neg-check-nonneg -ATH-shift-neg -CERT-INT34-C_c*/
397
+ sx = i0 & static_cast <int32_t >( 0x80000000 );
398
+ j0 = ( ( i0 >> 23 ) & 0xFF ) - 0x7F ;
399
+ if ( j0 < 23 ) {
400
+ const int32_t tmp = ( j0 < 0 ) ? sx : ( sx | ( i0 & ~( 0x007FFFFF >> j0 ) ) );
401
+ cast_reinterpret ( ret, tmp );
402
+ }
403
+ /* cstat +MISRAC++2008-5-0-21 +MISRAC++2008-2-13-3 +ATH-neg-check-nonneg +ATH-shift-neg +CERT-INT34-C_c*/
404
+ return ret;
311
405
}
312
406
/* ============================================================================*/
313
407
float ffmath::frac ( float x )
0 commit comments