gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:40:48 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com