如果我将十进制数 3120.0005 转换为 float (32 位)表示形式,该数字将向下舍入为 3120.00048828125。
假设我们使用比例为 10^12 的定点数,则 1000000000000 = 1.0 和 3120000500000000 = 3120.0005。
为了得到 3120000488281250,要四舍五入到最接近的 IEEE 754 精度的公式/算法是什么? 我还需要一种方法来获得四舍五入的结果 (3120000732421875)。
最佳答案
如果除以小数比例因子,您会找到最接近的可表示 float 。对于另一个方向的舍入,可以使用 std::nextafter
:
#include <float.h>
#include <math.h>
#include <stdio.h>
long long scale_to_fixed(float f)
{
float intf = truncf(f);
long long result = 1000000000000LL;
result *= (long long)intf;
result += round((f - intf) * 1.0e12);
return result;
}
/* not needed, always good enough to use (float)(n / 1.0e12) */
float scale_from_fixed(long long n)
{
float result = (n % 1000000000000LL) / 1.0e12;
result += n / 1000000000000LL;
return result;
}
int main()
{
long long x = 3120000500000000;
float x_reduced = scale_from_fixed(x);
long long y1 = scale_to_fixed(x_reduced);
long long yfloor = y1, yceil = y1;
if (y1 < x) {
yceil = scale_to_fixed(nextafterf(x_reduced, FLT_MAX));
}
else if (y1 > x) {
yfloor = scale_to_fixed(nextafterf(x_reduced, -FLT_MAX));
}
printf("%lld\n%lld\n%lld\n", yfloor, x, yceil);
}
结果:
3120000488281250
3120000500000000
3120000732421875
关于c - 舍入到 IEEE 754 精度但保留二进制格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55779284/