hrefspace

 找回密码
 立即注册
搜索
热搜: PHP PS 程序设计
查看: 1354|回复: 8

如何快速求最相邻近的浮点数(C++)

[复制链接]

275

主题

454

帖子

1014

积分

大司空

Rank: 5Rank: 5

积分
1014
发表于 2023-10-2 16:28:35 | 显示全部楼层 |阅读模式
已知:一个 double 型浮点数 \(c \; (c \gt 1.0)\),
求:另一个 double 型浮点数 \(x\),使得其差 \(d =\abs{x-c}\) 非 \(0.0\) 但尽可能地小。

备注:数据存储遵循 IEEE 二进制浮点数算术标准(IEEE 754)

要求:在满足需求的前提下,实现应尽可能地高效(用 C/C++ 语言)
回复

使用道具 举报

0

主题

181

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2023-10-2 16:29:32 | 显示全部楼层
我当前的策略是:令 \(x = c * ( 1.0 \pm \text{DBL_EPSILON} )\)
回复

使用道具 举报

0

主题

179

帖子

4

积分

新手上路

Rank: 1

积分
4
发表于 2023-10-2 16:30:11 | 显示全部楼层
看出64位整数加1看看
回复

使用道具 举报

0

主题

194

帖子

171

积分

关内侯

Rank: 2

积分
171
发表于 2023-10-2 16:30:25 | 显示全部楼层
typedef union {
        double d;
        long long ll;
} dll;
double near(dll in){in.ll^=1;return in.d;}
double nearest(dll in){in.ll-=1;return in.d;}
前面那个理论上更快一点,然而后面那个能正确地输出最小值(比如最接近1的数字)
回复

使用道具 举报

0

主题

199

帖子

66

积分

关内侯

Rank: 2

积分
66
发表于 2023-10-2 16:31:02 | 显示全部楼层
用整型计算替换浮点计算,是算法加速的技巧之一。
我现在需要的可能是“左相邻”,也可能是“右相邻”的数;但究竟是需要左还是右,得上下文决定。

换个话题:假设对于已知 \(c\),我们得到其“左相邻”或“右相邻”的浮点数 \(x\),其是否真正相邻,可否用下列代码判定:
  1. const double m = 0.5 * ( x + c );assert( x != c && ( m == x || m == c ));
复制代码
回复

使用道具 举报

0

主题

185

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2023-10-2 16:31:45 | 显示全部楼层
boost里有关于float的对比, 很具体,分成了三类:
https://www.boost.org/doc/libs/1 ... oat_comparison.html
Absolute difference/error: the absolute difference between two values a and b is simply fabs(a-b). This is the only meaningful comparison to make if we know that the result may have cancellation error (see below).
The edit distance between the two values: i.e. how many (binary) floating-point values are between two values a and b?
The relative distance/error between two values. This is quick and easy to compute, and is generally the method of choice when checking that your results are "tolerably close" to one another.
回复

使用道具 举报

0

主题

201

帖子

71

积分

关内侯

Rank: 2

积分
71
发表于 2023-10-2 16:32:23 | 显示全部楼层
找出double型数的52位尾数部分(实际上是53位,因最高位总是1,故不存储),在最低位加1或者减1,找出最合适的。
需要,要注意极端情况,52位尾数为全1,或者全0.
回复

使用道具 举报

1

主题

163

帖子

64

积分

关内侯

Rank: 2

积分
64
发表于 2023-10-2 16:32:41 | 显示全部楼层
说得没错。我印象当中是这样的。当浮点数特别小时,在指数取到最小时仍不能正确表示,这时使用非正规形式,尾数部分的最高位可为0.
回复

使用道具 举报

0

主题

192

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2023-10-2 16:33:25 | 显示全部楼层
好消息,今天无意中搜到了一组函数,
原来在 C++11 起就已经提供了:std::nextafter, std::nexttoward
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|hrefspace

GMT+8, 2024-11-22 15:03 , Processed in 0.073195 second(s), 21 queries .

Powered by hrefspace X3.4 Licensed

Copyright © 2022, hrefspace.

快速回复 返回顶部 返回列表