c - 舍入到 IEEE 754 精度但保留二进制格式

标签 c algorithm formula ieee-754 fixed-point

如果我将十进制数 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/

相关文章:

c - 使用 sscanf() 从一行中仅输出 2 个标记

c - C 中每个数据包都有 TTL 的数据包队列的最佳收集类型是什么

algorithm - 使用 dijkstra 算法在图中找到源和目标之间的最短路径

python-3.x - python中多个AGV的最短路径算法

c - C fork() 和 wait() 调用如何工作?

android - 将 unsigned long long 转换为等效的 jni 数据类型?

arrays - Matlab:如何对二维数组进行排名并在另一个二维数组中标记排名?

r - 在线性模型中结合 cbind 和 paste

r - 将公式传递给R中的函数?

javascript - 如何计算两个数字的最小值?