小编典典

给定数字位于哪个段中?[重复]

algorithm

假设具有n(整数)个长度l(浮点)的连续段。那是:

Segment 0 = [0, l)
Segment 1 = [l, 2*l)
Segment 2 = [2*l, 3*l)
... 
Segment (n-1) = [(n-1)*l, n*l)

给定一个数字x(浮点数),我想确定其位于其中的段的ID。

我的第一个想法是:

int segmentId = (int) floor(x/l);

无论如何,这有时不起作用。例如,考虑

double l = 1.1;
double x = 5.5;
int segmentId = (int) floor(x/l); //returns 5


double l = 1.1;
double x = 6.6;
int segmentId = (int) floor(x/l); //returns 5!!!

当然,由于有限的算术,这不能很好地工作。可能需要一些额外的检查才能具有可靠的实现,但是我真的不知道如何进一步进行。

问题是: 您将如何解决“给定数字位于哪个细分市场”的问题?


阅读 229

收藏
2020-07-28

共1个答案

小编典典

您的问题是1.1,或6.6都无法在二进制浮点中精确表示。所以当你输入

double l = 1.1;
double x = 6.6;

您将获得2个存储在l和中的数字x,它们与1.1和略有不同6.6。之后,int segmentId = (int) floor(x/l);为那些稍有不同的数字确定正确的段,而不是为原始数字确定正确的段。

您可以通过使用十进制浮点数据类型而不是二进制来解决此问题。您可以检查C
十进制数据类型和C 的精确十进制数据类型吗?库,或者自己实现十进制数据类型。

但是对于数字,仍然存在问题,这些数字在有限的十进制浮点数中无法表示,例如1/3(循环分数),sqrt(2)(无理),pi(超越)等。

2020-07-28