10 const double values[],
17 for (
int i=0; i<count; i++) {
25#if defined(CompilerICC)
40 assertion1(
sizeof(
long int)*8>=64,
sizeof(
long int) );
46 int shiftExponent = 6;
48 const long int sign = value < 0.0 ? -1 : 1;
55 const double significand = std::frexp(value , &integerExponent);
58 double error = std::numeric_limits<double>::max();
66 const double shiftMantissa = std::pow( 2.0,shiftExponent );
68 int exponent = integerExponent-shiftExponent;
69 long int mantissa =
static_cast<long int>( std::round(significand*shiftMantissa) );
71 error =
std::abs( std::ldexp(mantissa,exponent) - value );
97 assertion1(
sizeof(
long int)*8>=64,
sizeof(
long int) );
102 int shiftExponent = 6;
104 const long int sign =
value < 0.0 ? -1 : 1;
111 const double significand = std::frexp(value , &integerExponent);
113 for (
int i=0;
i<8;
i++) {
114 const double shiftMantissa = std::pow( 2.0,shiftExponent );
116 if (integerExponent-shiftExponent >= std::numeric_limits<char>::min() ) {
117 exponent[
i] =
static_cast<char>( integerExponent-shiftExponent );
118 mantissa[
i] =
static_cast<long int>( std::round(significand*shiftMantissa) );
124 error[
i] =
std::abs( std::ldexp(mantissa[i],exponent[i]) - value );
126 assertion5( mantissa[i]>=0, value, mantissa[i], exponent[i], error[i], sign );
128 std::bitset<64>* mantissaAsBitset =
reinterpret_cast<std::bitset<64>*
>( &(mantissa[
i]) );
131 for (
int j=(i+1)*8-1;
j<64;
j++) {
133 !(*mantissaAsBitset)[j],
134 *mantissaAsBitset, value,
static_cast<int>( exponent[i] ), mantissa[i], error[i], i, j, significand, integerExponent
140 assertion ( (*mantissaAsBitset)[ (i+1)*8-1 ]==
false );
141 mantissaAsBitset->flip( (i+1)*8-1 );
162 assertion1(
sizeof(
long int)*8>=64,
sizeof(
long int) );
167 int shiftExponent = 6 + (bytesForMantissa-1)*8;
169 const long int sign =
value < 0.0 ? -1 : 1;
176 const double significand = std::frexp(value , &integerExponent);
178 int exponentAsInteger = integerExponent-shiftExponent;
180 if (exponentAsInteger <= std::numeric_limits<char>::min()) {
185 exponent =
static_cast<char>( exponentAsInteger );
187 const double shiftMantissa = std::pow( 2.0,shiftExponent );
188 mantissa =
static_cast<long int>( std::round(significand*shiftMantissa) );
190 assertion4( mantissa>=0, value, mantissa, exponent, sign );
192 std::bitset<64>* mantissaAsBitset =
reinterpret_cast<std::bitset<64>*
>( &(mantissa) );
195 assertion ( (*mantissaAsBitset)[ (bytesForMantissa)*8-1 ]==
false );
196 mantissaAsBitset->flip( (bytesForMantissa)*8-1 );
215 int shiftExponent = 6;
217 const long int sign = value < 0.0 ? -1 : 1;
224 const double significand = std::frexp(value , &integerExponent);
226 for (
int i=0; i<4; i++) {
227 const double shiftMantissa = std::pow( 2.0,shiftExponent );
229 if (integerExponent-shiftExponent >= std::numeric_limits<char>::min() ) {
230 exponent[i] =
static_cast<char>( integerExponent-shiftExponent );
231 mantissa[i] =
static_cast<int>( std::round(significand*shiftMantissa) );
237 error[i] =
std::abs( std::ldexp(mantissa[i],exponent[i]) - value );
239 assertion5( mantissa[i]>=0, value, mantissa[i], exponent[i], error[i], sign );
241 std::bitset<
sizeof(
int)*8 >* mantissaAsBitset =
reinterpret_cast<std::bitset< sizeof(
int)*8
>*>( &(mantissa[i]) );
244 for (
int j=(i+1)*8-1; j<static_cast<int>(
sizeof(
int) )*8; j++) {
246 !(*mantissaAsBitset)[j],
247 *mantissaAsBitset, value,
static_cast<int>( exponent[i] ), mantissa[i], error[i], i, j, significand, integerExponent
253 assertion ( (*mantissaAsBitset)[ (i+1)*8-1 ]==
false );
254 mantissaAsBitset->flip( (i+1)*8-1 );
269 std::bitset<64>* mantissaAsBitset =
reinterpret_cast<std::bitset<64>*
>( &mantissa );
271 if ( (*mantissaAsBitset)[ bytesUsed*8-1 ] ) {
272 mantissaAsBitset->flip( bytesUsed*8-1 );
273 mantissa = -mantissa;
276 const double doubleMantissa = mantissa;
277 const int intExponent = exponent;
279 return std::ldexp(doubleMantissa,intExponent);
#define assertion4(expr, param0, param1, param2, param3)
#define assertion1(expr, param)
#define assertion9(expr, param0, param1, param2, param3, param4, param5, param6, param7, param8)
#define assertion5(expr, param0, param1, param2, param3, param4)
int __attribute__((optimize("O0"))) toolbox
int sign(double value, double tolerance=NUMERICAL_ZERO_DIFFERENCE)