C语言中负数除法与右移取整问题

C语言中负数除法与右移取整问题

今天碰到了负数除法与右移的替代问题,借机研究一下C语言中负数除法的问题。此处只讨论整数除2的幂次方的情况,并取-7~-5除以4为例,不讨论一般除法的移位优化。

  1. 负数右移
    

对于有符号整数,右移时按高位补符号位的原则,则结果会向小于它的整数取整。如

-5 >> 2 = -2;

-6 >> 2 = -2;

-7 >> 2 = -2;

  1. 负数除法(截断)
    

博文《议“右移一位 等同于 除以二”》http://blog.chinaunix.net/uid-406135-id-3421605.html中有这样一段描述:“C99和C++0x规定,商向零靠近取整,在 C99 和 C++0x 之前,只保证商*除数+余数==被除数,如果希望商向零靠近取整,应当使用div函数。”

那上述算式就会有结果:

-5 / 4 = -1;

-6 / 4 = -1;

-7 / 4 = -1;

  1. 负数除法(四舍五入)
    

四舍五入的意义就在于向临近的整数取整,但问题就在于对.5这个临界点如何进行处理。这里有一种说法,即是说对于负数相除四舍五入的情况,可以先将符号拿掉,按正整数做除法,最后再把符号位加到结果上即可。那上述算式的结果应该为:

-5 / 4 = -1;

-6 / 4 = -2;

-7 / 4 = -2;

sign(val) * (abs(val) +(1<< (n-1) )>> n)。

Microsoft Excel的取整就是采用这种方法。

但是,在ARM的NEON运算里的rounding,以及java的Math.round()函数的返回值来看(参考http://www.cnblogs.com/jiutianhe/archive/2012/10/07/2755655.html):

在.5这个临界点上,对于正负值都是向上取整。即是说按公式(val+ (1 << (n-1))) >> n进行计算。即:

-5 / 4 = -1;

-6 / 4 = -1;

-7 / 4 = -2;

C语言如何进行取整

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/114935.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Matlab粒子群算法(PSO)优化程序——经典实例

    Matlab粒子群算法(PSO)优化程序——经典实例粒子群算法(ParticleSwarmOptimization,PSO)最早是由Eberhart和Kennedy于1995年提出,它的基本概念源于对鸟群觅食行为的研究。鸟群中有个体和群体,个体和群体的信息是可以互通的。个体在随机搜寻食物的过程中,只要跟踪离食物最近的群体,就能最有效地找到食物。1.一些基本概念:(1)粒子:优化问题的候选解,指鸟群中的一个个个体;(2)位置:候选解所在…

  • 数独口诀_数独技巧xwing推导过程

    数独口诀_数独技巧xwing推导过程数独是一种传统益智游戏,你需要把一个 9×9 的数独补充完整,使得图中每行、每列、每个 3×3 的九宫格内数字 1∼9 均恰好出现一次。请编写一个程序填写数独。输入格式输入包含多组测试用例。每个测试用例占一行,包含 81 个字符,代表数独的 81 个格内数据(顺序总体由上到下,同行由左到右)。每个字符都是一个数字(1−9)或一个 .(表示尚未填充)。您可以假设输入中的每个谜题都只有一个解决方案。文件结尾处为包含单词 end 的单行,表示输入结束。输出格式每个测试用例,输出一行数据,代表填充

  • java策略模式例子(一个完整的java程序示例)

    以一个顾客价格计算策略为背景,写一个策略模式的demo参考代码:https://github.com/zhang-xiaoxiang/DesignPatterns23没有用策略模式我们一般是下面的写法,直接写一个类,在类里面直接写策略算法(功能实现)//packagecom.demo.strategy;/***NoStrategy:没有策略的做法*实现起来比较容…

  • 3.1、Eclipse

    3.1、Eclipse

  • SPSS操作(四):系统聚类分析

    SPSS操作(四):系统聚类分析现用如下数据做系统聚类分析:将数据导入spss中,如图:步骤如下:①【分析】—-【分类】—-【系统聚类】②x2、x3、x4、x5、x6、x7、x8添加到变量,x1(即地区)添加到个案标注依据小技巧:添加变量的时候,可以单击【医疗机构床位数(张)】,然后按住shift键不松,鼠标单击【医院(个)】就可以选择多个变量一起添加③点击【统计】勾选【解的范围】,可以根据自己的需要选择最小聚类数和最大聚类数(这里我设置为2和5),然后点击【继续】④点击【图】,(这里我选择的是做系谱图

    2022年10月18日
  • vue遍历数组中的数组_vue数组转json

    vue遍历数组中的数组_vue数组转jsonchange(event,day){//day是days数组里的//错误写法:this.clickorigindate=day相当于传地址给clickorigindate//newDate(ms);参数ms表示的是时间戳//时间戳,getTime()方法,是北京时间1970年01月01日08时00分00秒起至现在的总秒数。//正确写法如下,传值给clickorigindate,…

    2022年10月19日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号