提问: 对float的小数部分四舍五入 怎样能有效率

cunsh 2009-08-12 10:42:16


现在要对float的小数部分四舍五入 (或者丢弃小数部分)

请问怎样能有效率


多谢了~
...全文
202 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
jinzonghui 2009-08-13
  • 打赏
  • 举报
回复
支持一楼。
2009-08-12
  • 打赏
  • 举报
回复
一定要用C/C++的话,受到语言限制,浮点转整数都是直接丢弃小数部分(即向0舍入),要四舍五入,(int)(num+0.5)是我想得到的最快的办法了。
如果可以直接使用处理器的浮点指令舍入为整数,应当会更快,但IEEE没有四舍五入的舍入,类似的只有“四舍六入五成双”的舍入,做科学计算的对这种舍入方式应当比较熟悉吧。如果不要求严格符合四舍五入,这也是一种较快的办法。
一次浮点转整数的操作量比起将这个点绘制出来应该是比较小的,个人看法。

例(在 Intel x87 环境下)

浮点转浮点整数(楼主说的“每次绘制都先转到int再转回float”是这个意思吧):

fstcw WORD PTR fcw ;获取控制寄存器的值
and WORD PTR fcw, 0xf3ff ;设置舍入类型,第11、10位为零
fldcw WORD PTR fcw ;载入设置好的值
fld num
frndint
fstp num


浮点转整型整数:

fstcw WORD PTR fcw ;获取控制寄存器的值
and WORD PTR fcw, 0xf3ff ;设置舍入类型,第11、10位为零
fldcw WORD PTR fcw ;载入设置好的值
fld num
fistp DWORD PTR int_num


大量使用时控制寄存器设置一次就够了
superbtl 2009-08-12
  • 打赏
  • 举报
回复
LZ可以研究下float是怎么存储的 可以直接用位操作吧
baihacker 2009-08-12
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 cunsh 的回复:]
引用 2 楼 baihacker 的回复:
看到效率这两个字...


是这样的  我们代码中坐标用的float  在绘制的时候坐标也是float
但是它的小数部分不为0的时候(比如100.5) 发现绘制的图片很模糊.

这个每秒60帧  每帧所有的东西都从这里绘制. 每次绘制都先转到int再转回float会不会有效率影响?
[/Quote]

还是用测试结果说话吧...
cunsh 2009-08-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 baihacker 的回复:]
看到效率这两个字...
[/Quote]

是这样的 我们代码中坐标用的float 在绘制的时候坐标也是float
但是它的小数部分不为0的时候(比如100.5) 发现绘制的图片很模糊.

这个每秒60帧 每帧所有的东西都从这里绘制. 每次绘制都先转到int再转回float会不会有效率影响?
pengzhixi 2009-08-12
  • 打赏
  • 举报
回复
不懂!!
baihacker 2009-08-12
  • 打赏
  • 举报
回复
还是相信系统算了,应该在CPU级的微代码里面有处理.
  • 打赏
  • 举报
回复
只会强制转换。//
飞天御剑流 2009-08-12
  • 打赏
  • 举报
回复
小数点精确到后两位的四舍五入可以这样做:floor( Flt * 100 + 0.5 ) / 100

有效率的话,要找个算法高强的人来.
Z782282738 2009-08-12
  • 打赏
  • 举报
回复
强制转换就没小数了。
(int)(num+0.5)也可以。但是有错码。
chenzhp 2009-08-12
  • 打赏
  • 举报
回复
我也想知道
Victor_Dinho 2009-08-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 coverallwangp 的回复:]
引用 1 楼 victor_dinho 的回复:
(int)(num+0.5)


这是最简单,最直接方法
[/Quote]

我只知道这个了~~不知道有没有其他更好的方法~~
starcat 2009-08-12
  • 打赏
  • 举报
回复
哎,俺只知道一种算法。
coverallwangp 2009-08-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 victor_dinho 的回复:]
(int)(num+0.5)
[/Quote]

这是最简单,最直接方法
baihacker 2009-08-12
  • 打赏
  • 举报
回复
看到效率这两个字...
Victor_Dinho 2009-08-12
  • 打赏
  • 举报
回复
(int)(num+0.5)

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧