use*_*466 2 c# floating-point precision
给定两个浮点值(fLow和fHigh),您如何计算两个连续值之间的最大或最大步幅/差距?
例如:
在范围16777217f到20000000f答案是2,因为值有效四舍五入到最接近的两位.
将其推广到任意范围让我摸不着头脑 - 任何建议?
干杯,
这应该是语言中立的,但我正在使用C#(我认为这符合IEEE-754).
这是在C.它需要一些IEEE 754行为,用于舍入等.对于IEEE 754的64位二进制(double),SmallestPositive是2 -1074,大约4.9406564584124654417656879286822137236505980261e-324,和DBL_EPSILON是2 -52,2.220446049250313080847263336181640625e-16.对于32位二进制(float),改DBL到FLT和double到float任何地方出现,他们(和fabs向fabsf和fmax到fmaxf,尽管它应该没有这些改变工作).然后SmallestPositive是2 -149,大约1.401298464324817070923729583289916131280261941876515771757068283889791e-45,和FLT_EPSILON是2 -23,1.1920928955078125e-07.
对于两个值之间的间隔,最大步长当然是端点处具有较大幅度的步长.(如果该端点是完全的二的幂,从该点步长到下一个未出现在所述间隔本身,所以这将是一种特殊情况.)
#include <float.h>
#include <math.h>
/* Return the ULP of q.
This was inspired by Algorithm 3.5 in Siegfried M. Rump, Takeshi Ogita, and
Shin'ichi Oishi, "Accurate Floating-Point Summation", _Technical Report
05.12_, Faculty for Information and Communication Sciences, Hamburg
University of Technology, November 13, 2005.
*/
double ULP(double q)
{
// SmallestPositive is the smallest positive floating-point number.
static const double SmallestPositive = DBL_EPSILON * DBL_MIN;
/* Scale is .75 ULP, so multiplying it by any significand in [1, 2) yields
something in [.75 ULP, 1.5 ULP) (even with rounding).
*/
static const double Scale = 0.75 * DBL_EPSILON;
q = fabs(q);
return fmax(SmallestPositive, q - (q - q * Scale));
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
122 次 |
| 最近记录: |