找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 4282|回复: 6

【算法】带四舍五入的整除

[复制链接]

1112

主题

1652

回帖

7万

积分

用户组: 管理员

一只技术宅

UID
1
精华
245
威望
744 点
宅币
24251 个
贡献
46222 次
宅之契约
0 份
在线时间
2298 小时
注册时间
2014-1-26
发表于 2018-3-30 09:42:30 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
在嵌入式开发上使用浮点数等于作死。

  1. #define DIVIDE_WITH_ROUND(N, D)  (((N) == 0) ? 0:((((N) * 2)/(D)) + 1)/10)
复制代码


经测试,在特殊情况下依然有误差。要根据实际的使用需求来使用它。

在单片机平台上,使用这种除法来实现LCD屏幕绘制斜线,效果比较好。贴近于你在PC上用浮点数+SetPixel来绘制斜线。和GDI的MoveToEx()、LineTo()的效果非常接近。

参考资料:
https://stackoverflow.com/questions/
2422712
/rounding-integer-division-instead-of-truncating/
18067292

https://
en
.wikipedia.org/wiki/Line_drawing_algorithm

本帖被以下淘专辑推荐:

回复

使用道具 举报

30

主题

211

回帖

2790

积分

用户组: 版主

UID
1821
精华
7
威望
69 点
宅币
2170 个
贡献
206 次
宅之契约
0 份
在线时间
481 小时
注册时间
2016-7-12
发表于 2018-4-11 20:13:35 | 显示全部楼层
N 和  D似乎需要括号!
回复 赞! 靠!

使用道具 举报

1112

主题

1652

回帖

7万

积分

用户组: 管理员

一只技术宅

UID
1
精华
245
威望
744 点
宅币
24251 个
贡献
46222 次
宅之契约
0 份
在线时间
2298 小时
注册时间
2014-1-26
 楼主| 发表于 2018-4-14 19:53:17 | 显示全部楼层
Ayala 发表于 2018-4-11 20:13
N 和  D似乎需要括号!

已更新
回复 赞! 靠!

使用道具 举报

30

主题

211

回帖

2790

积分

用户组: 版主

UID
1821
精华
7
威望
69 点
宅币
2170 个
贡献
206 次
宅之契约
0 份
在线时间
481 小时
注册时间
2016-7-12
发表于 2018-5-3 21:23:08 | 显示全部楼层
计算机上修约一般采用4舍6入5取偶的方式
回复 赞! 靠!

使用道具 举报

30

主题

211

回帖

2790

积分

用户组: 版主

UID
1821
精华
7
威望
69 点
宅币
2170 个
贡献
206 次
宅之契约
0 份
在线时间
481 小时
注册时间
2016-7-12
发表于 2018-5-3 21:35:14 | 显示全部楼层
本帖最后由 Ayala 于 2018-5-5 21:11 编辑
  1. (N) / (D)  \
  2. + ((N) % (D)) * 2 > (D) \
  3. ? 1 \
  4. : (((N) % (D)) * 2 < (D) \
  5. ? 0 \
  6. : ((N) / (D)) & 1 == 0  \
  7. ? 0 \
  8. : 1)

复制代码

不知道语法有没有错误!
回复 赞! 靠!

使用道具 举报

9

主题

178

回帖

1万

积分

用户组: 真·技术宅

UID
4293
精华
6
威望
441 点
宅币
8680 个
贡献
850 次
宅之契约
0 份
在线时间
339 小时
注册时间
2018-9-19
发表于 2018-11-21 10:54:20 | 显示全部楼层
#define DIVIDE_WITH_ROUND(N, D)  (((N) == 0) ? 0 : ((((N) * 2)/(D)) + 1)/10) // 你确定最后是除10?前面 * 2,后面应该 / 2 才平衡啊!

// 重新优化一下(* 2 和 / 2 可以用位移优化):
#define DIVIDE_WITH_ROUND(N, D)  (((N) == 0) ? 0 : ((((N) << 1) / (D)) + 1) >> 1)
// 如果再考虑一下有符号运算(我不确定N的位数,不敢直接用位运算取符号位,所以用更稳妥的比较运算代替):
#define DIVIDE_WITH_ROUND(N, D)  (((N) == 0) ? 0 : ((((N) << 1) / (D)) + ((N) > 0)) >> 1)
回复 赞! 靠!

使用道具 举报

0

主题

43

回帖

60

积分

用户组: 小·技术宅

UID
4536
精华
0
威望
2 点
宅币
12 个
贡献
0 次
宅之契约
0 份
在线时间
6 小时
注册时间
2018-12-6
发表于 2018-12-6 10:39:16 | 显示全部楼层
学习了,谢谢
回复 赞! 靠!

使用道具 举报

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-4-25 19:09 , Processed in 0.049102 second(s), 34 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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