gpt4 book ai didi

c++ - 如何进行带有偏差的浮点舍入(总是向上或向下舍入)?

转载 作者:可可西里 更新时间:2023-11-01 18:27:00 26 4
gpt4 key购买 nike

我想用一个偏差来舍入 float ,要么总是向下要么总是向上。代码中有一个特定点我需要这个,程序的其余部分应该像往常一样四舍五入到最接近的值。

例如,我想四舍五入到最接近的 1/10 的倍数。最接近 7/10 的 float 约为 0.69999998807,但最接近 8/10 的 float 约为 0.80000001192。当我四舍五入数字时,这是我得到的两个结果。我宁愿让他们以同样的方式四舍五入。 7/10 应四舍五入为 0.70000004768,8/10 应四舍五入为 0.80000001192。

在这个例子中,我总是四舍五入,但我有一些地方我想总是向下舍入。幸运的是,我只处理这些地方的积极值(value)观。

我用来四舍五入的线是 floor(val * 100 + 0.5)/100。我正在用 C++ 编程。

最佳答案

我认为实现这一目标的最佳方法是依赖于这样一个事实,即根据 IEEE 754 浮点标准,浮点位的整数表示按字典顺序排列为 2 补码整数。

即您可以简单地添加一个 ulp(最后一位的单位)以获得下一个浮点表示(如果它更小,它总是比您的阈值略大,因为舍入误差最多为 1/2 ulp)

例如

 float floatValue = 7.f/10;
std::cout << std::setprecision(20) << floatValue << std::endl;
int asInt = *(int*)&floatValue;
asInt += 1;
floatValue = *(float*)&asInt;
std::cout << floatValue << std::endl;

打印(在我的系统上)

 0.69999998807907104492
0.70000004768371582031

要知道何时需要添加一个 ulp,您必须依靠 floor 和圆角 floor 的区别

 if (std::floor(floatValue * 100.) != std::floor(floatValue * 100. + 0.5)) {
int asInt = *(int*)&floatValue;
asInt += 1;
floatValue = *(float*)&asInt;
}

会正确地将 0.69.. 转换为 0.70.. 但保留 0.80..。

请注意,在应用 floor 之前, float 通过与 100. 的乘法提升为 double 。

如果你不这样做,你就有可能陷入这样的境地

 7.f/10.f * 100.f

(精度有限) float 表示为 70.00...

关于c++ - 如何进行带有偏差的浮点舍入(总是向上或向下舍入)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/685907/

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