我正在开发一个使用Crypto++的加密应用程序。作为该应用程序的一个晦涩部分,我需要确定在某个数值范围内可能存在的唯一浮点数值的最大数量。
显然,在现实中0和1之间有无限多个数字,但并非所有数字都可以由唯一的浮点数值表示。
我有一个最小浮点值和一个最大浮点值。我需要确定此范围内可能的浮点数值的数量。
这很棘手,因为浮点值越远离0,它们之间的间隔就越大。
例如,0和1之间可能的浮点值数量与100,000和100,001之间的浮点值数量非常不同。
对于我的目的,我希望计数包括最小值和最大值。但是,生成“排除”计数的算法也同样有用,因为我只需根据需要添加1或2。
另一个问题是:如果0在范围内怎么办?例如,如果最小值为-2.0,最大值为正2.0,则我不希望将0计算两次(一次是为0,一次是为-0)。此外,如果最小值或最大值为+/-无穷大会出现什么问题?(如果最小值或最大值为NaN,则可能会引发异常)。
如果这个问题可以得到解决,我认为解决方案同样适用于double值(并可能适用于long double值,但由于80位整数值等复杂原因可能会更加复杂)。
显然,在现实中0和1之间有无限多个数字,但并非所有数字都可以由唯一的浮点数值表示。
我有一个最小浮点值和一个最大浮点值。我需要确定此范围内可能的浮点数值的数量。
这很棘手,因为浮点值越远离0,它们之间的间隔就越大。
例如,0和1之间可能的浮点值数量与100,000和100,001之间的浮点值数量非常不同。
对于我的目的,我希望计数包括最小值和最大值。但是,生成“排除”计数的算法也同样有用,因为我只需根据需要添加1或2。
另一个问题是:如果0在范围内怎么办?例如,如果最小值为-2.0,最大值为正2.0,则我不希望将0计算两次(一次是为0,一次是为-0)。此外,如果最小值或最大值为+/-无穷大会出现什么问题?(如果最小值或最大值为NaN,则可能会引发异常)。
uint32_t RangeValueCount ( float fMin , float fMax )
{
if ( fMin > fMax )
swap ( fMin , fMax ) ; // Ensure fMin <= fMax
// Calculate the number of possible floating-point values between fMin and fMax.
return ( *reinterpret_cast < uint32_t* > ( &fMax ) -
*reinterpret_cast < uint32_t* > ( &fMin ) ) + 1 ;
// This algorithm is obviously unsafe, assumes IEEE 754
// How should I account for -0 or infinity?
}
如果这个问题可以得到解决,我认为解决方案同样适用于double值(并可能适用于long double值,但由于80位整数值等复杂原因可能会更加复杂)。