Arcane  4.1.12.0
User documentation
Loading...
Searching...
No Matches
Math.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2026 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* Math.cc (C) 2000-2015 */
9/* */
10/* Various mathematical functions. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/ArcanePrecomp.h"
15
16#include "arcane/utils/Math.h"
17#include "arcane/utils/ArrayView.h"
18
19/*---------------------------------------------------------------------------*/
20/*---------------------------------------------------------------------------*/
21
22namespace Arcane
23{
24
25/*---------------------------------------------------------------------------*/
26/*---------------------------------------------------------------------------*/
27
28namespace
29{
30 union DoubleInt
31 {
32 double dblVal;
33 unsigned long long intVal;
34 explicit DoubleInt(const double x)
35 : dblVal(x)
36 {}
37 };
38
39 // 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
40 int digit_to_bits[] = { 0, 0, 0, 0, 0, 0, 0, 0, 41, 31, 26, 21, 16, 12, 11 };
41
42 inline double _doTruncate(double x, unsigned int numDiscardBits)
43 {
44 DoubleInt num(x);
45 if (numDiscardBits > 0) {
46 unsigned long long halfBit = (1ULL << (numDiscardBits - 1));
47 unsigned long long mantissaDiscardMask = ~(halfBit - 1) ^ 0xfff0000000000000ULL;
48 unsigned long long test = num.intVal & mantissaDiscardMask;
49 num.intVal &= 0xfff0000000000000ULL;
50 test += halfBit;
51 if (test == 0x0010000000000000ULL) {
52 num.dblVal *= 2.0;
53 }
54 else {
55 num.intVal |= test & ~halfBit;
56 }
57 }
58 return num.dblVal;
59 }
60
61 inline double _doTruncateDigit(double x, int nb_digit)
62 {
63 if (nb_digit <= 0)
64 return x;
65 if (nb_digit <= 8)
66 return (float)x;
67 if (nb_digit >= 15)
68 return x;
69 int nb_bit = digit_to_bits[nb_digit];
70 if (nb_bit == 0)
71 return x;
72 return _doTruncate(x, nb_bit);
73 }
74
75} // namespace
76
77/*---------------------------------------------------------------------------*/
78/*---------------------------------------------------------------------------*/
79
80extern double math::
81truncateDouble(double v, Integer nb_digit)
82{
83 return _doTruncateDigit(v, nb_digit);
84}
85
86/*---------------------------------------------------------------------------*/
87/*---------------------------------------------------------------------------*/
88
89extern void math::
91{
92 Integer n = values.size();
93 if (n == 0)
94 return;
95
96 if (nb_digit <= 0)
97 return;
98 if (nb_digit <= 8) {
99 for (Integer i = 0; i < n; ++i)
100 values[i] = (float)values[i];
101 return;
102 }
103 if (nb_digit >= 15)
104 return;
105 int nb_bit = digit_to_bits[nb_digit];
106 if (nb_bit == 0)
107 return;
108 for (Integer i = 0; i < n; ++i)
109 values[i] = _doTruncate(values[i], nb_bit);
110}
111
112/*---------------------------------------------------------------------------*/
113/*---------------------------------------------------------------------------*/
114
115} // namespace Arcane
116
117/*---------------------------------------------------------------------------*/
118/*---------------------------------------------------------------------------*/
Modifiable view of an array of type T.
constexpr Integer size() const noexcept
Returns the size of the array.
double truncateDouble(double v, Integer nb_digit)
Truncates the precision of the real number v to nb_digit significant figures.
Definition Math.cc:81
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
Int32 Integer
Type representing an integer.