gpt4 book ai didi

c++ - C++ 中的舍入和往返数字

转载 作者:搜寻专家 更新时间:2023-10-31 00:36:48 24 4
gpt4 key购买 nike

我有一个类在内部将定点中的某个数量表示为带有某种任意分母的 32 位整数(它既不是 2 的幂也不是 10 的幂)。

为了与其他应用程序通信,数量在输出和输入时转换为普通的旧 double 值。作为类中的代码,它看起来像:

int32_t quantity;
double GetValue() { return double(quantity) / DENOMINATOR; }
void SetValue(double x) { quantity = x * DENOMINATOR; }

现在我需要确保如果我将某个值输出为 double 值并读回,我将始终得到相同的值。 IE。那个

x.SetValue(x.GetValue());

永远不会改变x.quantity(x 是包含上述代码的类的任意实例)。

double 表示的精度更高,所以应该是可以的。但是上面的简单代码几乎肯定不是这种情况。

  • 我需要使用什么舍入和
  • 我如何找到关键的可能极端情况来测试舍入是否确实正确?

最佳答案

当您转换为 double 时,任何 32 位都将被精确表示,但是当您除以然后乘以任意值时,您将得到相似但不完全相同的值。每次操作您最多应该丢失一位,这意味着在转换回 int 之前,您的 double 值几乎相同。但是,由于 int 转换是截断,当非常小的错误将 2.000 变成 1.999 时,您将得到错误的结果,因此您需要做的是在转换前进行简单的舍入任务。

如果您有 C++11,您可以为此使用 std::lround(),否则您可以编写自己的舍入函数。

你可能不太关心这里的公平性,所以常见的 int(doubleVal+0.5) 将用于积极。如果看起来很可能,你有底片,试试这个:

int round(double d) { return d<0?d-0.5:d+0.5; }

关于c++ - C++ 中的舍入和往返数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20883498/

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