现在的位置: 首页 > 综合 > 正文

C语言四舍五入函数

2018年05月17日 ⁄ 综合 ⁄ 共 1122字 ⁄ 字号 评论关闭

转载自:http://hi.baidu.com/wendaosheyu/blog/item/6781cb08b9d7d23be82488cf.html

刚才做编程练习的时候突然发现题里面居然要求与一个浮点数最近似的整数,很明显是四舍五入.然后就找,书上网上找了半天,得出一个结论:标准C语言没有四舍五入函数
然后我就写了这个:

int NearestInt (double _FloatInput)
{
int _Temp;
short int FloatControlWord;

_asm
{
fstcw FloatControlWord
mov ax,FloatControlWord
and ax,1111001111111111B
xchg ax,FloatControlWord
fldcw FloatControlWord
fld _FloatInput
frndint
fist _Temp
xchg ax,FloatControlWord
fldcw FloatControlWord
}

return _Temp;
}

我用的是VC6,写这个函数的时候那个该死的东西死了不下十次,好痛苦
我就纳闷了,为啥有向上取整和向下取整,就没有四舍五入呢?这三个和向零取整都是FPU的功能啊.有必要到CSDN上问一下
另外刚才发现个问题,我小学的老师教的时候2.45这样的数四舍五入是3    OMG!错了十多年
=========================================================================
只用C语言也行:
int   NearestInt (double _FloatInput)
{return (int)(_FloatInput)+((int)(10*_FloatInput)%10<5?0:1);}
上面那个只能求正数的,这个可以求正数和负数的:
int   NearestInt (double F)
{return (int)(F)+(F>=0?(int)(10*F)%10<5?0:1:-(int)(10*F)%10<5?0:-1);}
搞笑而已,这个效率很低的,编译出来指令相当多了
int   NearestInt (double F)
{return F>0?(int)(F+0.5):(int)(F-0.5);}
这个看起来比较不错,但生成的指令还是比上面那个汇编的多,但是那个汇编的指令其实还可以少,3条指令就OK了但保存和恢复控制字就要放在大量使用四舍五入的地方的前面和后面了
=========================================================================
又有发现了,printf输出的时候是四舍五入的

抱歉!评论已关闭.