52 #ifndef vtkFastNumericConversion_h
53 #define vtkFastNumericConversion_h
60 #if defined(NDEBUG) && (defined i386 || defined _M_IX86)
71 #if defined(__linux__)
76 #ifdef VTK_TEST_HACK_TO_EMULATE_LINUX_UNDER_WINDOWS
106 return ConvertFixedPoint(val, frac);
112 ConvertFixedPoint(val, frac);
131 return static_cast<double>(
static_cast<unsigned long>(1) << 30);
140 return (static_cast<unsigned long>(1) << (52-30)) * two30();
152 return (static_cast<unsigned long>(1) << (51-30)) * two30();
162 return (static_cast<unsigned long>(1) << (63-60)) * two30() * two30();
172 return (static_cast<unsigned long>(1) << (62-60)) * two30() * two30();
222 static inline double RoundingTieBreaker()
224 return 1.0 / (two30() * (
static_cast<unsigned long>(1) << (
EXT_BITS -
INT_BITS - 30)));
242 {
return two52() * BorrowBit(); };
252 {
return two51() * BorrowBit(); };
260 {
return two63() * BorrowBit(); };
268 {
return two62() * BorrowBit(); };
276 #ifdef VTK_WORDS_BIGENDIAN
277 enum {exponent_pos = 0, mantissa_pos = 1};
279 enum {exponent_pos = 1, mantissa_pos = 0};
303 unsigned long mtime = this->
GetMTime();
304 this->SetinternalReservedFracBits(bits);
307 this->InternalRebuild();
330 static int QuickFloor(
const double &
val);
346 static int SafeFloor(
const double &
val);
357 static int Round(
const double &
val);
365 union {
int i[2];
double d; } u;
367 u.d = (((val - fixRound)
368 + this->epTempDenormalizer)
369 - this->epTempDenormalizer)
370 + this->fpDenormalizer;
371 #else // ! VTK_EXT_PREC
372 u.d = (val - fixRound)
373 + this->fpDenormalizer;
374 #endif // VTK_EXT_PREC
375 fracPart = (u.i[mantissa_pos] & fracMask) >> 1;
376 return u.i[mantissa_pos] >> this->internalReservedFracBits;
386 void InternalRebuild(
void);
392 #ifndef VTK_LEGACY_SILENT
393 static int QuickFloorInline(
const double &
val);
394 static int SafeFloorInline(
const double &
val);
395 static int RoundInline(
const double &
val);
398 int internalReservedFracBits;
404 double fpDenormalizer;
407 double epTempDenormalizer;
418 #ifndef VTK_LEGACY_SILENT
419 inline int vtkFastNumericConversion::QuickFloorInline(
const double &
val)
425 union {
int i[2];
double d; } u;
427 u.d = (((val - (QuickRoundAdjust() - RoundingTieBreaker()))
429 + QuickExtPrecTempDenormalizer())
431 - QuickExtPrecTempDenormalizer())
432 + QuickFloorDenormalizer();
433 #else // ! VTK_EXT_PREC
434 u.d = (val - (QuickRoundAdjust() - RoundingTieBreaker()))
435 + QuickFloorDenormalizer();
436 #endif // VTK_EXT_PREC
437 return u.i[mantissa_pos];
438 #else // ! VTK_USE_TRICK
439 return static_cast<int>(
val);
440 #endif // VTK_USE_TRICK
443 #ifndef VTK_LEGACY_SILENT
444 inline int vtkFastNumericConversion::SafeFloorInline(
const double &val)
450 union {
int i[2];
double d; } u;
452 u.d = (((val - SafeRoundAdjust())
453 + SafeExtPrecTempDenormalizer())
454 - SafeExtPrecTempDenormalizer())
455 + SafeFloorDenormalizer();
456 #else // ! VTK_EXT_PREC
457 u.d = (val - SafeRoundAdjust())
458 + SafeFloorDenormalizer();
459 #endif // VTK_EXT_PREC
460 return u.i[mantissa_pos] >> SafeFinalShift();
461 #else // ! VTK_USE_TRICK
462 return static_cast<int>(
val);
463 #endif // VTK_USE_TRICK
466 #ifndef VTK_LEGACY_SILENT
467 inline int vtkFastNumericConversion::RoundInline(
const double &val)
473 union {
int i[2];
double d; } u;
476 + QuickExtPrecTempDenormalizer())
477 - QuickExtPrecTempDenormalizer())
478 + QuickFloorDenormalizer();
479 #else // ! VTK_EXT_PREC
481 + QuickFloorDenormalizer();
482 #endif // VTK_EXT_PREC
483 return u.i[mantissa_pos];
484 #else // ! VTK_USE_TRICK
487 return static_cast<int>(val + 0.5);
491 return static_cast<int>(val - 0.5);
493 #endif // VTK_USE_TRICK
static double QuickRoundAdjust()
static double SafeExtPrecTempDenormalizer()
static int QuickFloor(const double &val)
int TestConvertFixedPointFracPart(double val)
abstract base class for most VTK objects
int TestSafeFloor(double val)
#define vtkGetMacro(name, type)
static int SafeFinalShift()
static double BorrowBit()
static double SafeFloorDenormalizer()
int TestConvertFixedPointIntPart(double val)
#define vtkTypeMacro(thisClass, superclass)
static double RoundingTieBreaker()
virtual void PrintSelf(ostream &os, vtkIndent indent)
virtual unsigned long GetMTime()
GLenum GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * bits
a simple class to control print indentation
Enables fast conversion of floating point to fixed point.
int TestQuickFloor(double val)
static int SafeFloor(const double &val)
void SetReservedFracBits(int bits)
static double QuickFloorDenormalizer()
int ConvertFixedPoint(const double &val, int &fracPart)
static double QuickExtPrecTempDenormalizer()
static double SafeRoundAdjust()
~vtkFastNumericConversion()
static int Round(const double &val)
int TestRound(double val)
#define VTKCOMMONMATH_EXPORT
#define vtkSetMacro(name, type)