the*_*man 3 c++ algorithm floating-point
假设有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)
Run Code Online (Sandbox Code Playgroud)
给定一个数字x
(浮点数)我想确定它所在的段的id.
我的第一个想法如下:
int segmentId = (int) floor(x/l);
Run Code Online (Sandbox Code Playgroud)
无论如何,这有时不起作用.例如,考虑一下
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!!!
Run Code Online (Sandbox Code Playgroud)
当然,由于有限的算术,这不能很好地工作.为了实现强大的实现,可能需要一些额外的检查,但我真的不知道如何继续进行.
问题是:你如何解决问题"给定数字在哪个部分?"
你的问题既不是1.1
,也不能6.6
完全用二进制浮点表示.所以当你打字
double l = 1.1;
double x = 6.6;
Run Code Online (Sandbox Code Playgroud)
你存储在2号l
和中x
,这比略有不同1.1
和6.6
.之后,int segmentId = (int) floor(x/l);
为那些略有不同的数字确定正确的段,但不是原始数字.
您可以使用十进制浮点数据类型而不是二进制来解决此问题.您可以检查C++的C++十进制数据类型和精确十进制数据类型吗?对于库,或自己实现十进制数据类型.
但问题仍然存在于数字中,这些数字在有限小数浮点数中无法表示,例如1/3
(循环分数),sqrt(2)
(无理数),pi
(超越)等.
归档时间: |
|
查看次数: |
150 次 |
最近记录: |