Logo ROOT  
Reference Guide
RooNaNPacker Struct Reference

Little struct that can pack a float into the unused bits of the mantissa of a NaN double.

This can be used to transport information about violation of function definition ranges, negative PDFs or other computation problems in RooFit. To separate NaNs that contain packed floats from regular NaNs, a tag is written into the upper bits of the mantissa. If this tag is found, a payload can be recovered. Otherwise, the NaN is assumed to originate from other sources than a RooFit class that wants to signal to the minimiser.

Definition at line 28 of file RooNaNPacker.h.

Public Member Functions

constexpr RooNaNPacker ()
 
 RooNaNPacker (float value)
 Create NaN with a packed floating point number. More...
 
void accumulate (double val)
 Accumulate a packed float from another NaN into this. More...
 
double getNaNWithPayload () const
 Retrieve a NaN with the current float payload packed into the mantissa. More...
 
float getPayload () const
 Retrieve packed float. More...
 
bool isNaNWithPayload () const
 Test if this struct has a float packed into its mantissa. More...
 
RooNaNPackeroperator*= (float val)
 Multiply the packed float. More...
 
RooNaNPackeroperator+= (float val)
 Add to the packed float. More...
 
void setPayload (float payload)
 Pack float into mantissa of NaN. More...
 

Static Public Member Functions

template<class It_t >
static double accumulatePayloads (It_t begin, It_t end)
 Unpack floats from NaNs, and sum the packed values. More...
 
static bool isNaNWithPayload (double val)
 Test if val has a float packed into its mantissa. More...
 
static double packFloatIntoNaN (float payload)
 Pack float into mantissa of a NaN. More...
 
static float unpackNaN (double val)
 If val is NaN and a this NaN has been tagged as containing a payload, unpack the float from the mantissa. More...
 
static void warn ()
 Warn that packing only works on little-endian machines. More...
 

Public Attributes

double _payload
 

Static Public Attributes

static constexpr uint64_t magicTag = 0x321ab00000000
 
static constexpr uint64_t magicTagMask = 0x3ffff00000000
 

#include <RooNaNPacker.h>

Constructor & Destructor Documentation

◆ RooNaNPacker() [1/2]

constexpr RooNaNPacker::RooNaNPacker ( )
inlineconstexpr

Definition at line 38 of file RooNaNPacker.h.

◆ RooNaNPacker() [2/2]

RooNaNPacker::RooNaNPacker ( float  value)
inlineexplicit

Create NaN with a packed floating point number.

Definition at line 42 of file RooNaNPacker.h.

Member Function Documentation

◆ accumulate()

void RooNaNPacker::accumulate ( double  val)
inline

Accumulate a packed float from another NaN into this.

Definition at line 57 of file RooNaNPacker.h.

◆ accumulatePayloads()

template<class It_t >
static double RooNaNPacker::accumulatePayloads ( It_t  begin,
It_t  end 
)
inlinestatic

Unpack floats from NaNs, and sum the packed values.

Definition at line 63 of file RooNaNPacker.h.

◆ getNaNWithPayload()

double RooNaNPacker::getNaNWithPayload ( ) const
inline

Retrieve a NaN with the current float payload packed into the mantissa.

Definition at line 90 of file RooNaNPacker.h.

◆ getPayload()

float RooNaNPacker::getPayload ( ) const
inline

Retrieve packed float.

Returns zero if number is not NaN or if float wasn't packed by this class.

Definition at line 85 of file RooNaNPacker.h.

◆ isNaNWithPayload() [1/2]

bool RooNaNPacker::isNaNWithPayload ( ) const
inline

Test if this struct has a float packed into its mantissa.

Definition at line 95 of file RooNaNPacker.h.

◆ isNaNWithPayload() [2/2]

static bool RooNaNPacker::isNaNWithPayload ( double  val)
inlinestatic

Test if val has a float packed into its mantissa.

Definition at line 100 of file RooNaNPacker.h.

◆ operator*=()

RooNaNPacker& RooNaNPacker::operator*= ( float  val)
inline

Multiply the packed float.

Definition at line 78 of file RooNaNPacker.h.

◆ operator+=()

RooNaNPacker& RooNaNPacker::operator+= ( float  val)
inline

Add to the packed float.

Definition at line 72 of file RooNaNPacker.h.

◆ packFloatIntoNaN()

static double RooNaNPacker::packFloatIntoNaN ( float  payload)
inlinestatic

Pack float into mantissa of a NaN.

Adds a tag to the upper bits of the mantissa, so a "normal" NaN can be differentiated from a NaN with a payload.

Definition at line 109 of file RooNaNPacker.h.

◆ setPayload()

void RooNaNPacker::setPayload ( float  payload)
inline

Pack float into mantissa of NaN.

Definition at line 46 of file RooNaNPacker.h.

◆ unpackNaN()

static float RooNaNPacker::unpackNaN ( double  val)
inlinestatic

If val is NaN and a this NaN has been tagged as containing a payload, unpack the float from the mantissa.

Return 0 otherwise.

Definition at line 122 of file RooNaNPacker.h.

◆ warn()

static void RooNaNPacker::warn ( )
inlinestatic

Warn that packing only works on little-endian machines.

Definition at line 129 of file RooNaNPacker.h.

Member Data Documentation

◆ _payload

double RooNaNPacker::_payload

Definition at line 29 of file RooNaNPacker.h.

◆ magicTag

constexpr uint64_t RooNaNPacker::magicTag = 0x321ab00000000
staticconstexpr

Definition at line 36 of file RooNaNPacker.h.

◆ magicTagMask

constexpr uint64_t RooNaNPacker::magicTagMask = 0x3ffff00000000
staticconstexpr

Definition at line 35 of file RooNaNPacker.h.

Collaboration diagram for RooNaNPacker:
[legend]

The documentation for this struct was generated from the following file: